- 035966_L3 的博客
-
Sleeping Cup #9 Editorials
- @ 2026-3-18 22:04:46
A - Minimum-Maximum Compounds
画出表达式树,不难发现答案就是树上同种操作构成的极大连通块个数。
#include <bits/stdc++.h>
using namespace std;
int main()
{
freopen("compounds.in", "r", stdin);
freopen("compounds.out", "w", stdout);
int T;
cin >> T;
while (T--)
{
string S;
cin >> S;
int ans = 0;
stack <int> st;
st.push('#');
for (int i = 0; i < S.size(); i++)
{
if (S[i] == '(' && st.top() != S[i - 1]) ans++;
if (S[i] == '(') st.push(S[i - 1]);
if (S[i] == ')') st.pop();
}
cout << ans << endl;
}
return 0;
}
B - Savings Challenge
写出程序计算所有 种状态是必胜态还是必败态。列出表格,观察图形性质,可得:
| 答案 | ||
|---|---|---|
| Sleeping Alligator | ||
| Sleeping Iguana | ||
| Sleeping Alligator | ||
| Sleeping Iguana | ||
| Sleeping Alligator | ||
| Sleeping Iguana | ||
| Sleeping Alligator | ||
| Sleeping Iguana | ||
| Sleeping Alligator | ||
| Sleeping Iguana | ||
| Sleeping Alligator | ||
| Sleeping Iguana | ||
#include <bits/stdc++.h>
using namespace std;
const string names[2] =
{
"Sleeping Iguana",
"Sleeping Alligator"
};
const int results[3][6] =
{
{1, 0, 0, 1, 1, 1},
{0, 1, 0, 1, 0, 0},
{1, 0, 1, 0, 0, 0}
};
int main()
{
freopen("savings.in", "r", stdin);
freopen("savings.out", "w", stdout);
int T, n, m;
cin >> T;
while (cin >> n >> m) cout << names[results[n % 3][m % 6]] << endl;
return 0;
}
C - 2048: Python vs. OOM
Subtask 1
下文记 。
众所周知,,因此魔法是在指数上加 。
由于最终的指数和一定等于最初的指数和加上 ,因此题目等价于最大化:
根据直觉,对 取模等于不断减去 直至目标小于 ,因此最大化上面的值,就要尽量减少减去 的次数:每次取 最小的 个数字加 ,最不容易触发「减去 」操作。
这一策略不能通过样例的第 6 组测试数据,但可以证明它在子任务 1 下是正确的。
直接借助 std::sort 模拟上述过程的时间复杂度是 ,空间复杂度是 ,可以通过子任务 1。
Subtask 2
众所周知,对于题目中的方式,可以先确定每个数字被加的次数 —— 只要次数总和等于 ,并且每个数字被加的次数不超过 ,就一定存在对应方案。
于是我们可以设 表示前 个数字一共被加 次后这 个数 之和的最大值,初始状态为 ,转移时枚举下一个数字被加的次数即可,最终的最大总和是 。
该算法的时间复杂度是 ,空间复杂度是 ,可以通过子任务 2。
Subtask 3
注意到对一个数进行 次加 操作不会改变它 的值。当 很大时,只要确定每个数字被操作的次数 的值,使这些值的总和不大于 且与 在模 意义下同余,就很可能存在对应的方案 —— 具体来说,在这些值的基础上,每次选择一个值加上 ,直至总和达到 。
上面的「很可能」要求构造方案的过程中不会出现「所有数都大于 ,而总和还没达到 」的情况。此时这 个值的总和至少为 ,因此我们有不等式:
在子任务 3 的特殊限制下,,因此 时就可以放心使用以上结论:只确定每个数字被操作的次数 的值,按照子任务 2 中的 DP 算法求解。
上述 DP 算法的时间复杂度为 ;当 时需要回退到子任务 2 的解法,时间复杂度为 ,在 的限制下同样不超过 。
因此该算法的时间复杂度是 ,空间复杂度是 ,可以通过子任务 3。
Subtask 4
当 时,我们可以先把所有数字加上 ,然后操作变成了「施展 次魔法,每次魔法选择 个数字加上 」。此时我们有 ,并且前面所有解法的正确性都不依赖 的任何性质,因此我们可以回退到子任务 3 的解法。
最终的时间复杂度是 ,空间复杂度是 ,可以通过子任务 4。
#include <bits/stdc++.h>
using namespace std;
const int N = 30, P = 30, M = N + 12, Q = 2 * N * P + 12;
int b[M], dp[M][Q];
int main()
{
freopen("python.in", "r", stdin);
freopen("python.out", "w", stdout);
int T;
cin >> T;
while (T--)
{
memset(dp, 0xc0, sizeof dp);
int n, m, k, a, c, ans = 0;
cin >> n >> m >> k >> a;
__int128 sum = (__int128) m * (__int128) a * (__int128) k;
if (k > 2 * P) c = P - 1;
if (k <= 2 * P) c = k;
a %= P;
for (int i = 1; i <= n; i++)
{
cin >> b[i];
sum += b[i];
b[i] %= P;
}
if (2 * m > n)
{
for (int i = 1; i <= n; i++)
b[i] = (b[i] + 1ll * a * k) % P;
m = n - m;
a = (P - a) % P;
}
dp[0][0] = 0;
for (int i1 = 1; i1 <= n; i1++)
for (int i2 = 0; i2 <= i1 * c; i2++)
for (int i3 = 0; i3 <= min(i2, c); i3++)
dp[i1][i2] = max(dp[i1][i2], dp[i1 - 1][i2 - i3] + (b[i1] + a * i3) % P);
if (k > 2 * P)
for (int i = 1ll * m * k % P; i <= min(1ll * n * c, 1ll * m * k); i += P)
ans = max(ans, dp[n][i]);
if (k <= 2 * P) ans = dp[n][m * k];
cout << (long long) (4 * ((sum - ans) / P) + 36 * n + 56) << endl;
}
return 0;
}
D - The Zero Point
约定:
用等比数列求和化简:
$$D = \dfrac{A \cdot \dfrac{1 - (Ax)^{2n}}{1 - Ax} - B \cdot \dfrac{1 - (Bx)^{2n}}{1 - Bx}}{\sqrt{5}}$$忽略常数系数:
$$E = A \cdot \dfrac{1 - (Ax)^{2n}}{1 - Ax} - B \cdot \dfrac{1 - (Bx)^{2n}}{1 - Bx}$$当 时, 的每一项都非负,故 。
当 时,上面两项都是正数,故 。
当 时, 中偶数次项为负,奇数次项为正,且 次项的绝对值大于 次项,故 。
因此方程 在 内存在实根。
(25 分)
求导:
$$F = A^2\cdot\dfrac{1-2n(Ax)^{2n-1}+(2n-1)(Ax)^{2n}}{(1-Ax)^{2}} - B^2\cdot\dfrac{1-2n(Bx)^{2n-1}+(2n-1)(Bx)^{2n}}{(1-Bx)^{2}}$$$$F = A^2\cdot\dfrac{1+(2n-1)(A^{2n}x^{2n}-A^{2n-1}x^{2n-1})-(Ax)^{2n-1}}{(Ax-1)^{2}}-B^2\cdot\dfrac{1+(2n-1)(B^{2n}x^{2n}-B^{2n-1}x^{2n-1})-(Bx)^{2n-1}}{(Bx-1)^{2}}$$$$F = A^2 \cdot \dfrac{1 - (Ax)^{2n-1}}{(Ax-1)^{2}} - B^2 \cdot \dfrac{1 - (Bx)^{2n-1}}{(Bx-1)^{2}} + A^2 \cdot \dfrac{(2n-1)(Ax)^{2n-1}}{Ax-1} - B^2 \cdot \dfrac{(2n-1)(Bx)^{2n-1}}{Bx-1}$$$$F = A^2 \cdot \dfrac{1 - (Ax)^{2n-1}}{(Ax-1)^{2}} - B^2 \cdot \dfrac{1 + (Cx)^{2n-1}}{(Bx-1)^{2}} + A^2 \cdot \dfrac{(2n-1)(Ax)^{2n-1}}{Ax-1} + B^2 \cdot \dfrac{(2n-1)(Cx)^{2n-1}}{Bx-1}$$(50 分)
易知:
$$\left( \dfrac{(Tx)^{2n-1}}{Tx-1} \right)' = T(Tx)^{2n-2} \cdot \dfrac{(2n-1)(Tx-1)-Tx}{(Tx-1)^2}$$经过计算,上式代入 和 导数都为负。
因此我们对前两项代入 ,后两项代入 ,得到一个小于等于 的值:
$$G = A^2 \cdot \dfrac{A^{2n-1} + 1}{(A + 1)^2} - B^2 \cdot \dfrac{1 - C^{2n-1}}{(B+1)^{2}} + A^2 \cdot \dfrac{2n-1}{2} - B^2 \cdot \dfrac{(2n-1)C^{4n-2}}{B^2-1}$$改写:
$$G = A^2 \cdot \dfrac{A^m + 1}{(A + 1)^2} - B^2 \cdot \dfrac{1 - C^m}{(B+1)^{2}} + A^2 \cdot \dfrac{m}{2} - B^2 \cdot \dfrac{mC^{2m}}{B^2-1}$$(75 分)
注意到 且 ,因此第一项和第三项随 递增而递增,而第四项恒为正数,第二项大于 。
舍弃 的第四项,替换 的第二项,得到一个小于 的值:
$$H = A^2 \cdot \dfrac{A^m + 1}{(A + 1)^2} - \dfrac{B^2}{(B+1)^2} + A^2 \cdot \dfrac{m}{2}$$于是 关于 单调递增。
代入 对应的 ,计算得 ,从而 ,于是 在 上单调递增,方程 存在唯一实根。
的情形显然成立,故原命题得证!
(100 分)