青
P13357
难度:绿
不会。那咋办。
gcd 问题考虑枚举答案。枚举答案 \(w\),找到 \(\le R\) 的最大的 \(w\) 的倍数 \(R - (R\bmod w)\),只需判断 \(R - (R\bmod w) - w\) 是否 \(\ge L\)。正确性显然。
考虑怎么优化,将 \(R - (R\bmod w)\) 写成 \(\lfloor \frac{R}{w} \rfloor w\),也就是判断 \(\lfloor \frac{R}{w} \rfloor w - w\) 是否 \(\ge L\)。注意到 \(w\) 较大时,\(\lfloor \frac{R}{w} \rfloor\) 数量极少,是根号级别的。考虑枚举 \(t = \lfloor \frac{R}{w} \rfloor\),需要找到 \(w(t - 1)\) 的最大值,也就是使 \(w\) 最大,令 \(w = \frac{R}{t}\) 即可。那么做完了。时间复杂度 \(O(\sqrt R)\)。
P10849
难度:绿
急哭了。
对于 \(i\),显然是贪心往 \(1\sim i-1\) 放,同时选择等级尽量大的。容易用栈维护。
P9565
难度:绿
考虑什么时候答案满足 \(\ge V\):存在二进制位 \(b\),满足答案高 \(b-1\) 位与 \(V\) 相同,第 \(b\) 位 \(V\) 为 \(0\),答案为 \(1\)。
考虑怎么维护这个东西。遍历每一个二进制位 \(b\),初始化并查集,如果 \(V\) 当前位为 \(1\),把边权这一位为 \(0\) 的边都扔掉。否则如果为 \(0\),边权这一位为 \(1\) 的边就可以合并。对于每个 \(b\),如果 \(u,v\) 在当前层的并查集里在同一连通块,答案为 Yes。
如果每一层都不在,就为 No。
CF506D
难度:青
对每种颜色根号分治。
把相同颜色的边摘出来,如果个数 \(> \sqrt m\),这类颜色至多 \(\sqrt m\) 个,那么可以冰茶鸡维护连通块扫一遍询问,\(O(q\sqrt m)\)。否则个数 \(\le \sqrt m\),冰茶鸡维护,枚举所有点对算贡献,所有颜色点数的平方和 \(\le O( n\sqrt n)\)。于是就是 \(O(q\sqrt m\log q + n\sqrt n)\)。注意没有算冰茶鸡的常数。
CF1221F
难度:青
简单题。写出柿子之后容易扫描线维护。
P5679
难度:青
考虑三个数 \(a_i,a_j,a_k\),如果存在 \(a_i - a_j = a_k - a_i\),那么 \(a_k = 2a_i - a_j\),由于非负不妨转化 \(a_k + V = 2a_i - a_j + V\),维护 bitset \(f,g\),\(f\) 记录 \(a_k+V\),\(g_x\) 记录 \(V - a_j\)。
假设当前在加入 \(x\),如果 \(f_x=1\) 这组询问就有解。否则 \(f\) 对 \(g\) 左移 \(2x\) 的结果进行按位或,再把 \(g\) 的第 \(V - x\) 位设为 \(1\)。正确性显然。
bool ok = false;
for (ll i = 1; i <= n; ++ i ) {
ll x; cin >> x;
if (f[V + x]) ok = true;
f = f | (g << (x << 1));
g.set(V - x, 1);
}
cout << (ok ? "YES\n" : "NO\n");
P6241
难度:青
显然我们可以轻松得到 \(1,1,2,4,8,16,32,\cdots\),你考虑把其中 \(1\) 个减 \(1\),序列变成 \(1,1,2,3,7,14,28\cdots\),手玩得到规律,对 \(a_{n-i-1}\) 减少 \(1\),那么 \(a_n\) 减少 \(2^i\),那么找到第一个比 \(q\) 大的 \(p = 2^i\),把 \(p - q\) 二进制分解即可。
P16541
难度:蓝
容易会掉 \(O(nq)\)。考虑 dp 的本质是啥,本质上我们在维护最大值、次大值 \((A,B)\),每次给次大值加上 \(w_i\),如果加完 \(A < B\) 了就交换一下。那么有一个结论是 \(A + B =\sum w_i\),不妨记为 \(S\)。
注意到值域很小,\(w_i\le 50\),我们来考虑维护 \(A - B\) 的差,遇到一个 \(w_i\) 就 \(|A-B| \to |A-B-w_i|\)。由于操作具有可合并性,使用 sgt 维护。具体对于每个区间,维护 \(50\) 个节点,每个节点的值表示最初为 \(x\),经过当前区间会得到的值。pushup 的时候先走右区间,再走左区间。
void pu(ll k) {
for (ll i = 0; i <= 50; ++ i )
tc[k][i] = tc[k << 1][tc[k << 1 | 1][i]];
}
P15255
难度:蓝
\(O(2^nn^3)\) 可以通过。
考虑熔池,考虑一组 \((x,y,z)\),有一下几种情况:
- \(x\) 为 \(1\) 得分加 \(1\)。
- \(x,y\) 为 \(1\),得分减 \(1\)。
- \(x,z\) 为 \(1\),同上。
- \(x,y,z\) 为 \(1\),得分多减了,要加 \(1\)。
然后跑 sosdp 就完了。时间复杂度 \((n2^n + K)\)。
P14402
难度:蓝
神秘最短路。你考虑当前在 \((x,y)\),下一步能向哪移动??
- 向上下左右走一步,到最远的冰块。
- 走两步走到相邻节点。
直接建图做就是对的。证明考虑不合法的路径都不优。参考题解:
若考虑操作一所生成的冰块,直接返回等价于操作二,若绕一圈回到起点(例如先向右滑动到冰块前,并在起点生成一个冰块,再依次往下左上回到最初的位置)代价至少为 \(3\),这一步劣于直接向下移动一格,代价为 \(2\)。
若考虑操作二所生成的冰块,直接前进(例如先向右,左滑动,移动到右边一格,再继续向右滑动)劣于只执行一步操作一,若是继续绕一圈再回到原位,步数显然只会更多。
P5228
难度:青
考虑 dp,\(f_i\) 表示面值最大值为 \(i\) 时的最小代价,转移就枚举 \(i\) 的倍数作为最大值,更新减少的贡献。
P7768
难度:青
考虑对每个深度进行维护。维护每个深度点权的异或和。
对每个 dfs 序维护一珂主席树,查询的时候使用 \(ed_x\) 版本的主席树异或掉 \(st_x-1\) 版本的主席树,注意主席树上维护的是每个深度的点权异或和。
不会离线做法,跑路了。
P3200
难度:绿
考虑我们每次插数,当前在决策要放在奇数位还是偶数位。那么要求偶数位的个数 \(\ge\) 奇数位的个数,也就是入栈个数 \(\ge\) 出栈个数,即卡特兰数。
P17140
难度:蓝
咕了很久的 dp,补上了。
考虑啥时候会是树,你发现一个点至多被覆盖两次,然后要求覆盖的点连通。把线段按左端点排序,现在考虑第 \(i\) 条线段。两次我们关心右端点的次大值,连通关心最大值,把这两个东西放到状态里。\(f_{i,r_1,r_2,k}\) 表示考虑前 \(i\) 条线段,当前选的线段右端点的最大 / 次大值为 \(r_1,r_2\),选了 \(k\) 条的方案数。转移的时候:
- 不选 \(i\),\(f_{i,r_1,r_2,k} \leftarrow f_{i-1,r_1,r_2,k}\)。
- 选 \(i\),那么 \(l_i > r_2\)。你分讨右端点在哪,如果 \(r_2 < l_i \le r_i \le r_1\),有 \(f_{i,r_1,r_i,k} \leftarrow f_{i-1,r_1,r_2,k-1}\)。如果 \(r_2 < l_i \le r_1 < r_i\),有 \(f_{i,r_i,r_1,k} \leftarrow f_{i-1,r_1,r_2,k-1}\)。
那么滚动掉 \(i\) 就会 \(O(nm^2k)\) 了,获得滚木分数。
注意到 \(k\) 也只关心 \(k-1\),考虑提出来把 \(k\) 看作层,对每个 \(k\) 进行 dp。重新写一下转移:
- \(f_{i,r_1,r_2} \leftarrow f_{i-1,r_1,r_2}\)。
- \(f_{i,r_1,r_i} \leftarrow g_{i-1,r_1,r_2}\)。
- \(f_{i,r_i,r_1} \leftarrow g_{i-1,r_1,r_2}\)。
浙公网安备 33010602011771号