「2024 June」做题笔记
首先显然可以转化为选择若干条边使得给定点对全部联通。
性质一:如果中间一段区间在当前就不与左右端点联通了,那么向其祖先走也不可能联通。那我们可以在当前就判断了。
性质二:如果我们把上述情况看成联通(因为它不影响答案了),那么左边一部分点会与左端点联通,右边一部分点会与右端点联通。
所以可以设 \(f(i,j)\) 为 \([l,j]\) 与 \(l\) 联通,\([j+1,r]\) 与 \(r\) 联通,合法方案数。
中间只有一个断点的不是很好判断合法性,那就先不着急判断是否合法。发现这些都可以随便转移,但是 \(f_{lson,j}\) 与 \(f_{rson,k}\) 会出现上述情况,发现此时合法就是内部没有与外部的边,可以异或 hash,那么就是 \(j\) 与 \(k\) 的 hash 值相同。
改变状态为 \(f(i,j)\),\(j\) 表示断点 hash 值,那么就是 \(f(lson,j)*f(rson,j)\),线段树合并即可。
考虑每个数的贡献,考察前面影响到这个数的符号集合 \(\{p_i\}\),发现优先级可以转化成这样的形状:

考虑直接算概率,发现其实就是 \(\prod \frac {1} {i-p_i-1}\) 的形式。
所以答案为 \((n-1)(a_1+\sum_{i=2}^n a_i f_{i-1}\frac {1} {(i-1)!}\prod_{j=1}^{i-2} (f_j+i-j-1))\)
最右边的式子是阶乘每个数偏移 \(1\),想到四毛子,所以复杂度 \(\frac {n^2} {B}+\frac n B 2^B\)。
还有种做法是取自然对数转化为对每个 \(i\) 求 \(\sum \ln (i-c_j)\),这个可以直接卷积。(一个序列是 \(c_j\) 的出现次数,另一个序列是 \(\ln (i-c_j)\))
首先很诈骗的一点是 Alice 和 Bob 必胜的情况数是相同的。\((a,b)\) 必败,\((b,a)\) 就必胜。
所以只用算先后手。
引理:\(v_i\) 可对 \(a+b\) 取模。不难证明必胜者的策略不会被影响。
不妨进行一些观察。设 \(a<b\)。若存在 \(v_i\in [a,b)\),那么 \(a\) 必胜。若 \(v_i\geqslant 2a\),若 \(a\) 先手,那么 \(a\) 必胜。否则,\(b\) 可以选这个,那么如果这样的 \(v_i\) 有多个,\(a\) 就必胜了。否则就是看堆数奇偶了。
那这样这个题就很清晰了。枚举 \(a+b\),将取模后的 \(v_i\) 排序,然后 \(a,b\) 只能在 \((v_i,v_{i+1}]\) 中。讨论上述两种情况,也就是说讨论 \(a\in [v_{n-1}/2,v_n/2]\) 和 \(>v_n/2\),直接计算答案即可。
原题是个 anti-nim,可以让 \(n\leftarrow n-1\),因为如果必败者肯定是取最后一个石子,那么必胜者一定能取到倒数第二个石子。
打个表发现和斐波拉契很有关系,考虑一个结论是每个数可以被分成若干不相邻 fib 数相加且唯一。
其实这个模型是斐波拉契博弈,若第一个数可以任取,那么结论是 fib 数先手必败,否则先手必胜。
直接说这个题的结论:若分解的最小 fib 数 \(\geqslant k\) 那么先手必胜,否则先手必败。懒得证了。
直接数位 dp 即可。
补充一下 anti-nim:先手必胜当且仅当:
- 每堆的物品数为 \(1\) 且 \(nim\) 和为 \(0\)。
- 有一堆物品数 \(>1\) 且 \(nim\) 和不为 \(0\)。
anti-sg:
- 所有单一 sg 的 sg 值 \(\leqslant 1\),且 \(sg=0\)。
- 所有单一 sg 的 sg 值 \(>1\),且 \(sg>0\)。
打表得 sg,然后直接 fwt。
其实可以猜测没有多项式复杂度解法。
发现在 \(1\) 的联通块中只能走 \(1\) 的边,还有不能经过两次相同的 \(1\) 连通块。
发现前面很容易维护,后面的话,贡献至少是 \(2b\),所以合法路径一定 \(\geqslant 3a\),也就是说,这个连通块大小大于 \(4\)。
那么对于这些连通块状压跑最短路即可。
考虑每次删的个数和叶子数有关,如果我们将操作复杂度控制到 \(O(叶子)\) 就好了。
那么长链剖分即可。
打得很复杂。到时候来看有没有简洁打法。
都是 \(l\leqslant p_i\leqslant r\) 的形式,考虑容斥,变成 \(p_i\leqslant r\) 的形式。对此 dp 即可。
如果还是 dag 就是 \(\prod rd_i\)。
考虑出现环多算了什么。那么一定是 \(T\) 到 \(S\) 的一条路径。直接 DAG 上 dp 即可。
简单容斥+dp。
首先不难想到 \(3^n\) 的暴力 dp。
考虑将状态表示为 \(XY\) 的形式,相当于 meet-in-the-middle。然后转移你发现枚举一边的超集,另一边可以双指针。
问题是转移的贡献是 \(\max(c_1,c_2)\) 不太好处理,但是只需刚开始将 \(\{c\}\) 降序排序即可。
时间复杂度 \(O(6^n+3^n n)\)。
随。
可以广义 SAM 维护 endpos,询问可以离线使得线段树合并不开新点。
也可以 AC 自动机,先建出 fail 数,考虑差分成 \([x\times[1,y]]\) 的形式,那么一个一个加入串,查询就是查子树个数。
直接从后往前 dp 太困难了。那么从小到大考虑呢?
发现就做完了啊!直接 dp 即可,然后转移系数也可以 dp 求出。
考虑使用 trie 整体维护答案,那么加 \(1\) 其实就是经典做法了:从低位到高位建 trie,然后交换左右儿子,再递归处理。
把路径拆分成 \(x\rightarrow lca\) 和 \(lca\rightarrow y\),向上可以直接 trie 合并然后查,向下可以持久化 trie,或者进入子树加 \(1\),跳出子树减 \(1\),然后还有 trie 整体异或,都是基本操作。
如果你一开始就给自己打上一个题很难的思想钢印,那么你是做不出来这个题的。
观察一:显然应该从大到小选,然后能晚选就晚选。
观察二:这个多组是假的,可以转化为前 \(mi\) 次。令天数为 \(10^5\),然后一次一次选预处理即可。因为如果用更大的天数都能选这 \(mi\) 个,那更小的一定可以。
然后使用优先队列维护即可。
考虑 \(\{a\}\{b\}\) 先选前 \(K\) 大的,然后考虑反悔贪心,每次加一个配对的。
然后就很明了了。四种情况:
\1. 找一个没配对的 ai,和一个会配对的 aj,aj-ai
\2. 找一个没配对的 bi,和一个会配对的 bj,bj-bi
\3. 找一个没配对的 ai,找一个没配对的 bj,找一个空 k,ak+bk-ai-bj
\4. 找一个配对的 i,和两个可以配对的 aj,bk,aj+bk-ai-bi
对应的优先队列是:
1.没配对 ai
2.没配对 bi
3.没配对 bi 对应 ai
4.没配对 ai 对应 bi
5.配对 i
6.空
然后就做完了。
考虑枚举众数个数 \(c\),那么自然想到一个贪心:每次选最小的小于 \(x\) 且出现次数超过 \(c\) 的,将其变为 \(c\)。
考察一下这样做的次数。发现是 \(O(\frac n c)\) 的,因为一个位置进行一次操作后最后为 \(c\)。
然后非常智慧的观察:把答案看做关于 \(c\) 的函数,整个 \(f(c)\) 有凸性!那么对于单个 \(x\),可以二分最后一个右边大于左边的点找到那个最值。
多组询问就整体二分即可。2log。
当然这里也可以根号分治。小于 \(B\) 的暴力做,大于 \(B\) 的二分计算即可。
qoj7736 qoj 7905 qoj8330 qoj8542 qoj8240

浙公网安备 33010602011771号