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}\)
posted @ 2026-09-14 09:49  RainyRadio  阅读(5)  评论(0)    收藏  举报