2024.4
1.AGC066D A Independent Set
先把 \(T\) 串看成是 \(AB\) 和 \(B\) 的拼接,把 \(T\) 变成 \(S\) 的过程看成是 \(A\) 在移动。
考虑 \(T\) 中一段极长的 \(AB\) 连续段,你发现最左边的 \(A\) 一定会往右移,否则可以让这个连续段左边的 \(B\) 与 最左边的 \(AB\) 交换,这是不劣的。最右边同理,于是我们发现这个连续段中 \(A\) 的移动只会在内部进行,不会移到外面去!
于是考虑 dp。我们设 \(dp_i\) 是让 \(S[1,i]\) 和 \(T[1,i]\) 相同的最小代价,则一种转移是在后面接 \(B\) ,即 \(S_i=B\) 时有 \(dp_{i-1}\rightarrow dp_{i}\) 。还有一种是接 \(AB\) 连续段,我们设 \(s_i\) 表示把 \(A\) 看成 \(1\) ,\(B\) 看成 \(-1\) 时 \(S\) 的前缀和,则 \(s_j=s_i\) 时可以有 \(dp_j+val(j,i)\rightarrow dp_i\) 。可以观察到对于这第二类转移,我们只需要找 \(j<i\) 且 \(s_j=s_i\) 的 \(j\) 中最大进行转移即可,因为中间若隔了一个 \(k\) 满足 \(s_j=s_k=s_i\) ,那显然 \((j,k],(k,i]\) 两段的交换互相独立,\(j\rightarrow i\) 就是不需要的了。那刨去这种情况后,对于 \(j<k<i\) ,要么 \(s_k\) 全部 \(>s_i\) ,要么全部 \(<s_i\) ,也就是说 A 是全部向左/右移的。所以权值是很容易利用前缀和计算的,复杂度 \(O(n)\) 。
2.gym104053D Digits
直接从左往右 dp 是无法处理回文串的,我们一定是左右交替的添加段,并不断的从两端消去字符。考虑设 \(f_{i,j,s}\) 表示: 划分 \([i,j]\) 能得到多少个串拼上 \(s\) 后是回文的,\(g_{i,j,s}\) 就是 \(s\) 接在前面的方案数。转移以 \(f_{i,j,s}\) 为例,我们枚举第一段 \([i,k]\) ,让 \([i,k]\) 得到的串 \(t\) 和 \(s\) 进行消除,如果两个串都没有消完就寄了;否则根据哪个串非空,用 \(f_{k+1,j,s'}\) 或者 \(g_{k+1,j,t'}\) 转移即可。
分析一下这样做的复杂度,可以总状态数是 \(n^3\log V\) 种的:还是以 \(f_{i,j,s}\) 为例,\(s\) 一定是某个 \([j+1,k]\) 形成的串的某个前缀。于是复杂度为 \(O(n^4\log^2V)\) ,看似不能通过,但因为状态根本卡不满,利用 unordered_map 是能轻松通过的。
还是想想怎么优化吧。还是以计算 \(f\) 为例,我们把转移分成两种:\(s'\) 为空, \(t'\) 为空。
对于 \(t'\) 为空的情况,相当于 \(t\) 是 \(s\) 某个后缀 reverse 后的结果。计算 \(f'_{i,j,s}\) 表示 \(\sum\limits_{k=i}^{j+1} f_{k,j,s}\) ,然后枚举 \(s\) 的这个后缀,可以发现我们需要的 \(k\) 一定构成一个区间 \([l,r]\),于是用 \(f'_{l,j,s'}-f'_{r+1,j,s'}\) 即可计算。
对于 \(s'\) 为空的情况,我们不要直接枚举 \(s\) 。枚举 \(i,j,k\) ,我们可以得到 \(t\) 。发现能被转移的 \(s\) 只能是 \(t\) 一个前缀 reverse 后的结果,用 \(g_{k+1,j,t'}\) 转移给 \(f_{i,j,s}\) 即可。
复杂度 \(O(n^3\log V(\log n+\log V))\) 。
3.gym104076I Shortest Path
题意:给你一个带权无向图,令 \(ans_i\) 为:从 \(1\) 出发走恰好 \(i\) 条边到 \(n\) ,边权和的最小值,若不存在则为 \(0\) 。给定 \(x\) ,求 \(\sum\limits_{i=1}^x ans_i\) 对 \(998244353\) 取模的结果。
\(n\le 2000,m\le 5000,x\le 10^9\) 。
做法:
边数 \(\le4n\) 时直接暴力解决。
边数 \(>4n\) 时,可以感受到我们会通过少量的边到达一条关键边,往返若干次后再通过少量的边走到终点,因为此时边数是多余的,我们想在更小的边上”刷掉“这些边数。
有结论:
可一定存在一条最优路径满足:可以从 \(1\) 出发,先通过不超过 \(2n\) 条边走到 \(u\) ,在 \((u,v)\) 间往返若干次,再从 \(v\) 通过不超过 \(2n\) 条边走到 \(1\) 。
为什么呢?考虑一条不满足上述条件的路径并取出其中权值最小的边 \((u,v,w)\) ,把图上权值 \(<w\) 的边全部删去并把剩下的边权值全部减 \(w\) 。那如果从 \(v\) 到 \(n\) 的边数超过 \(2n\) 条 ,那我们可以把它替换成 \(v\) 到 \(n\) 边数同奇偶的最短路(边数一定不超过 \(2n\) 条)拼上若干次 \((u,v)\) 间的往返,这显然是不劣的。于是发现所有路径都能调整成上述的形式。
接下来考虑计算,先算出 \(A_{i,j},B_{i,j}(j\le2n)\) 分别表示 \(1\) 到 \(i\) 经过 \(j\) 条边的最短路,\(n\) 到 \(i\) 经过 \(j\) 条边的最短路。枚举这个关键边 \((u,v,w)\) ,计算出 \(X_i=\min\limits_{j\mod 2=i} A_{u,j}-jw,Y_i=\min\limits_{j\bmod 2=i} B_{v,j}-jw\) ,那么边数为 \(x\) 的答案即为 \(\min\limits_{i<2}(X_i+Y_{(T-1-i)\bmod 2})+xw\) 。
把 \(x\) 按奇偶分开后,实际上我们就能把 \(ans_x\) 写成 \(\min k_ix+b_i\) 的形式。
于是问题转化成,计算 \(\sum\limits_{x=L}^R \min\limits_{i} k_ix+b_i\) 。求出 \((k_i,b_i)\) 的凸包即容易计算。复杂度是 \(O(nm+m\log m)\) 。
4.gym103964I Mahjong
题意:给定 \(n,m\) ,其中 \(m\bmod 3=2\) 。 定义一个麻将牌集合是胡的,当且仅当:
-
集合大小为 \(m\)
-
可以划分成一个对子(即 \(i,i\))和 \(\frac{m-2}{3}\) 个面子(即 \(i,i+1,i+2\) 或 \(i,i,i\))。
现在有 \(4n\) 块麻将,其中大小为 \(i(1\le i\le n)\) 的麻将有 4 个。(同样大小的麻将被看做相同)问能从这些麻将中选出多少胡的麻将牌集合,对 \(10^9+7\) 取模。
\(n\le 100,m\le 200\) ,多测,\(T\le 100\) 。
做法:
先思考怎么判定一个麻将牌集合是胡的,可以考虑 dp:令 \(f_{i,z,x,k,l}\) 表示:已经确定了大小为 \(1\) 到 \(i\) 的牌的拆法, \([1,i]\) 中共有 \(z\) 张牌,有了 \(x\) 个对子,从 \(i-1\) 开始的顺子有 \(k\) 个,从 \(i\) 开始的顺子有 \(l\) 个的状态是不是能取到的。
可以看见 \(k,l\) 一定 \(\le 2\) ,因为一处选三个 \((i,i+1,i+2)\) 不如拆成 \((i,i,i)\) , \((i+1,i+1,i+1)\) ,\((i+2,i+2,i+2)\) 。
回到原问题,我们就考虑 ddp,把 \(f_{x,k,l}(x<2,k\le 2,l\le 2)\) 这 18 个数以及 \(z\) 一起压成一个状态, 令 \(dp_{i,j}\) 表示考虑了大小为 \([1,i]\) 的牌,形成状态为 \(j\) 的方案数。这样看似难以通过,因为看上去压成的状态数量是 \(2^{18}m\) 级别的。
但可以发现能到达的状态是很少的!首先确定 \(z\) 后,\(z+k+2l-2x\) 不为 \(3\) 的倍数的话,就一定取不到了,所以状态数是 \(2^6m\) 级别的。经过程序检验可以发现,可以到达的状态只有约 \(4500\) 种,符合我们的估计。
预处理出这些会到达的状态以及往后接一个数后到达的状态,这个题就做完了,复杂度 \(O(2^6Tnm)\) 。
5.AGC052E
处理三染色问题的套路:构造权值 \(a_i\) 使得有边相邻的两点权值差 \(\le 1\) ,且模 \(3\) 与其颜色同余。
对于这个题,我们就可以用上述方法表示出原串 \(a\) 和目标串 \(b\),我们要调整原串的 \(a_1\) ,使得操作步数最小。根据题目,每次肯定是让某个位置 +2/-2 ,所以最小代价一定不少于 \(\frac{1}{2}\sum |a_i-b_i|\) ,且需让 \(a_i,b_i\) 奇偶性相同。这也是可以达到的,不妨设存在位置满足 \(a_i>b_i\) ,找到其中最大的 \(a_p\) ,那一定有 \(a_{p-1}=a_{p+1}=a_i-1\) ,否则可以发现与最大性矛盾了。
就变成一个简单的解方程问题 (调整 \(a_1\)) ,容易完成。
6.AGC059E
和上面一题相同的套路:可以发现对于合法的三染色方案我们一定能构造出相应的矩阵。于是我们先算出边框的权值,若已矛盾显然无解;否则找点必要条件,首先 \(|a_{x,y}-a{z,w}|\le |x-z|+|y-w|\) ,但可以发现其中有一些限制是被其它限制包含的,具体的只需要判断 \(|a_{i,1}-a_{i,n}|\le n-1,|a_{1,i}-a_{n,i}|\le n-1\) 。
然后发现这就充分了!原因是我们可以构造 \(a_{x,y}=\max(a_{1,y}+(x-1),a_{n,y}+(n-x),a_{x,1}+(y-1),a_{x,n}+(n-y))\) 。
可以发现相邻两个差是恰好等于 \(1\) 的(可以先说明奇偶性不同,再说明差 \(\le 1\))满足题目限制。
7.P9040 [PA2021] Desant 2
可以转化成 \(k*(n/k)\) 网格上只能往下/往右走,多次询问从 \(s_i\) 到 \(t_i\) 的最长路。
分治解决,每次把网格长边劈一半。每次需要特殊处理一行末尾到下一行开头的情况。
8.P7908 [Ynoi2005] qwq
对偶之后转化成 \(\sum a_ib_i\) 的最大值,其中 \(\sum\limits_{i=l}^{l+m-1}b_i\le 1\) 。经典猜测: \(b_i\in \{-1,0,1\}\) 。
忽略 \(0\) ,我们需要相邻两个 \(1\) 距离大于等于 \(\geq k\) 。我们在这些相邻 \(1\) 之间劈一刀,可以发现得到每一段的答案其实都是和 \(m=n\) 的答案相同的(因为没有相邻 \(1\)) 。
于是问题转化成,取出若干不交子段,使每个子段 \([l,r]\) 的 \(a_l+\sum\limits_{l<i\le r}\max(a_i-a_{i-1},0)\) 之和最大,且两个相邻子段距离 \(\geq m\) 。为了让权值最大,第一个子段肯定会包含 \(1\) ,最后一个子段肯定会包含 \(n\) ,而相邻子段距离肯定 \(=m\) 。于是可以转化成在 \([m+1,n]\) 中取一些数使得 \(a_i-\sum\limits_{j=0}^{m-1}\max(a_{i-j}-a_{i-j-1},0)\) 之和最大,且相邻两个差 \(\geq m\)。
问题转化的差不多了。再考虑区间询问。实际上就和上面那个题没有差别了。
9.LOJ4139 「PA 2024」Kraniki
相当于,对每个板子算有多少个水龙头的水会流到它头上。怎么算呢,从这个板子出发低往高看,维护一个区间 \([l,r]\) ,初始是这个板子代表的区间。然后如果遇到一个板子包含它,再往上的水就流不到了,停止过程;否则若有交,则答案 +1 且区间变成和这个板子的并。
仔细思考一下,难点在于找让你停止的板子,找到后即可倍增处理。怎么找呢,你发现这其实就是求支配树。复杂度 \(O(n\log n)\) 。
10.LOJ4134 「PA 2024」Desant 3
考虑这样一个 dp,就是状态 \(S\) 表示一些位置的数是确定值,一些在 0/1 间任选,然后我们想算 \(dp_{S,i}\) 表示所有填法中经过操作 \(i+1\) 到 \(q\) ,成为合法态的方案个数。那你发现对于下一次操作,如果两边都是 0/1 ,我们充分利用模 2 ,发现 01 和 10 的填法会两两抵消,于是把两个位置填上 00/11 的方案数加起来;如果两边都确定就直接模拟;如果有一边是 0/1,可以发现最后的状态是唯一的。复杂度是什么呢,注意到这个搜索树只会出现 \(O(2^{n/2})\) 个分枝的地方,于是复杂度 \(O(2^{n/2}m)\) 。
11.LOJ4130 「PA 2024」Splatanie ciągów
先分析一下 \(f(a,b)\) 的计算方式,不妨设 \(|a|=n>|b|=m\) ,\(c_i=[a_i>a_{i+1}]\) ,令 \(s_i\) 是 \(c\) 每个连续段的长度,那 \(f(a,b)\le x\) 等价于 \(\sum [(s_i-1)/x]\le m\) 。
现在要算 \(a,b\) 各取一个子段的 \(f\) 之和,不妨只考虑 \(a\) 中取的子段大于 \(b\) 取的子段的情况。计算出 \(a\) 这整个序列对应的 \(s\) 。
然后分治计算答案,对于每个 \(x\) 统计出 \(L_i\) ,表示有多少对 \((a,b)\) 满足 \(l\le a\le mid,b\le s_a,[(b-1)/x]+\sum\limits_{i>a} [(s_i-1)/x]=i\) 。随着 \(a\) 的减少,\(b\) 的增加,对应的 \(i\) 会不断增加,只需要在每次变化时正确的计算即可。于是这里复杂度是 \(O(\sum\limits_{x}\sum s_i/x=s_i\log s_i)\) 。\(R_i\) 同理可以计算出,最后计算 \(\sum L_iR_jF(i+j)\) 即可。其中 \(F(x)\) 是 \(b\) 中有多少子段长度 \(<x\) ,这是个分段一次函数,于是计算时枚举 \(i\) 并处理 \(R_i,R_ii\) 的前缀和即可快速计算。总复杂度大概是 \(O(n\log^2n)\) 。
12.LOJ4127 「PA 2024」Grupa permutacji
首先算出能造出的排列个数都是困难的,只能拆开计算,即对于 \(i<j\) 算出最后 \(p^{-1}_i>p^{-1}_j\) 的概率。对于每一个排列我们能在 \((i,j),(p_i,p_j)\) 间连边。最后对于每一个联通块,若其中 \(i<j\) 的点个数为 \(a\),\(i>j\) 的为 \(b\) ,则答案加上 \(\frac{ab}{a+b}\) 。
问题是直接做复杂度是 \(O(n^2k)\) 的。怎么办呢,猜测可以随机化,但静心构造可以让 \(k\) 个排列都有用,于是考虑这样的随机化:每次任取排列的一个子集,算出把它们乘到一起得到的排列,用这个排列来连边。可以证明这样做 \(O(\log n)\) 次正确率就非常高了。不会证。
复杂度 \(O(n^2\log n)\) 。
13.CF1761F2 Anti-median (Hard Version)
通过观察长度为 \(3,5\) 的连续段可以得到合法排列的形式: \(a_{2i-1}<a_{2i}>a_{2i+1}\) ,且只看奇数位置呈单谷,看偶数位置呈单峰;也可以对称的把所有限制反过来。
只考虑第一种情况的方案数。我们把这些位置重排一下,即 \(1,3,5,...,...,6,4,2\) 这样排。把 \(1\) 到 \(n\) 依次填进这些位置,且把位置无限复制后,可以发现填了的值一定形成了一段区间,且需要满足 \(2\le l+r\le n+1\) ,但不包括终止位置。
后面就是比较平凡的计数了。
14.P10103 [GDKOI2023 提高组] 错排
计算 \(f(n,m)\) 为长度为 \(n\) 的排列其中对于 \(i\le m\) 有 \(p_i\neq i\) 。根据不同的枚举方式我们可以得到 \((n,m),(n+1,m)\) 推 \((n+1,m+1)\) ,\((n,m),(n,m+1)\) 推 \((n+1,m+1)\) ,\((n,m),(n,m+1)\) 推 \((n+1,m+2)\) 的方式。
于是通过这三种方式,我们维护 \((n,m),(n+1,m+1)\) ,每次 n/m +1/-1 时都能快速更新两个值,于是用莫队即可做到 \(O(n\sqrt{n})\) 。
15.万欧小复习
其实就是处理这类问题,随着 \(x\) 增大, \([(ax+b)/c]\) 变大时乘上矩阵 \(U\) ,\([x]\) 变大时乘上矩阵 \(R\) ,特别的 \((x,(ax+b)/c)\) 为整点时先乘 \(U\) 再乘 \(R\) 。计算最后得到的矩阵。怎么做呢,考虑 \(f(a,b,c,n,U,R)\) 表示 \(x\) 从 \(0\) 增大到 \(n\) ,得到的结果。
(这里不一定是矩阵,只要是满足结合律的信息就可以了)
怎么计算呢。先判掉 \(n=0\) ,此时等于单位矩阵 \(I\) 。分类讨论,\(b\geq c\) 时它等于 \(U^{[b/c]}+f(a,b\bmod c,c,n,U,R)\) ;\(a\geq c\) 时它等于 \(f(a\bmod c,b,c,n,U,U^{[a/c]}R)\) ;否则你考虑把这个 \(y=(ax+b)/c\) 中的 \(x,y\) 交换一下。具体的,令 \(t=[(an+b)/c]\) ,若 \(t=0\) ,则答案为 \(R^n\) 。
否则,我们取 \(y\in [1,t]\) 这一段来 \(x,y\) 交换做;然后再把两头拼上,即 \(y\) 不在这一段时多出的 \(R\) 。大致的感受是这样的,但问题在于我们规定先 \(U\) 后 \(R\) ,所以其实得再细致的讨论一下。
考虑第 \(x\) 个 \(R\) 之前有 \([(ax+b)/c]\) 个 \(U\) 。 那对于第 \(y\) 个 \(U\) ,其前面的 \(x\) 就要满足 \([(ax+b)/c]<y\) 。化一下,可以得到 \(x\le [(cy-1-b)/a]\) 。
我们去掉第一个 \(U\) 及之前的部分,这是 \(R^{[(c-b-1)/a]}+U\) 。对于中间第 \(i\) 个 \(U\) ,其前面 \(R\) 的个数即为 \([(c(i+1)-1-b)/a]-[(c-1-b)/a]=[((c-1-b)\bmod a+ci)/a]\) ,可以写成 \(f(c,(c-b-1)\bmod a,a,t-1,R,U)\) 。再把最后一节 \(R\) 拼上,个数容易计算: \(n-[(tc-b-1)/a]\) 。
于是最后有
\(R^{[(c-b-1)/a]}+U+f(c,(c-b-1)\bmod a,a,t-1,R,U)+R^{n-[(tc-b-1)/a]}\) 。
16.P10107 [GDKOI2023 提高组] 树
其实还是挺自然的,就一开始你会想定义一个 \(f(x,i)\) 表示 \(x\) 子树内 \(d_y-d_x<2^i\) 的点的 \(v_y\oplus(d_y-d_x)\) 之和,但这就需要我们得到子树内所有满足 \(d_y=d_x+2^{i-1}\) 的 \(f\) 之和。这里就需要做一个前缀和。
于是不妨改一下,设 \(f(x,i)\) 为 \(dfn_y<dfn_x+sz\) 且 \(d_x\le d_y<d_x+2^i\) 的点的 \(v_y\oplus (d_y-d_x)\) 之和。你发现这个时候 \(f\) 就非常好算了。用类似的方法多处理点东西,就容易进行询问了。
17.P10104 [GDKOI2023 提高组] 异或图
经典互不相等容斥。到最后是要算这么一个东西:就是容斥后的“生效集合”为 \(S\) 的方案数。先把这些数按 \(a\) 排序,然后考虑 \(f(S,T)\) 表示当前已经确定了 \(S\) 内的容斥方案,其中生效集合为 \(T\) ,直接转移是 \(O(4^n)\) 的,但你发现实际出现的状态是不多的,因为我们每次会让联通块包含第一个不在 \(S\) 里的集合。那么 \(T\) 不仅是 \(S\) 的子集,而且取出 \(S\) 的第一个 \(0\) 后,\(T\) 中的 \(1\) 都在这个 \(0\) 前面。也就是可以改写成 \(f(S',i)\) 表示 \(S\) 中第一个 \(0\) 在 \(i\) ,\(i\) 后 \(S\) 的状态和 \(i\) 前 \(T\) 的状态拼起来的结果。这样状态就是 \(O(2^nn)\) 的,总复杂度 \(O(3^nn)\) 。
18.P9052 [PA2021] Areny
类似于支配树,可以发现我们可以把图在不改变答案的情况下简化成一个内向基环森林。每次会加入一个点 \(u\) 的所有出边,这之前 \(u\) 一定是某个树的根,若它这些出点皆在一个联通块内,则我们找到这些点的 lca 为 \(f\) ,并连边 \((u,f)\) 。注意此时如果是 \(u\) 所在的联通块,则此树会变成基环树,需要处理一下。每次两个联通块合并后,可以发现会有一些新的点的出点在一个联通块内,这些新点能通过启发式合并/线段树合并快速找到,把它们丢到队列里并依次做上面的操作即可。
现在具体的思考一下应该怎么维护。由于这个题没有 cut 和 makeroot 操作,用 LCT 是非常清新的。每次连边 \(u,f\) 时答案会加上 \(f\) 到根的权值和,乘上 \(u\) 子树的 siz,我们只需要根的 siz 所以只需要在 LCT 上维护链的权值和。
变成基环树时我们直接暴力扫一遍计算答案的改变量,并修改上面的点的权值:把 \(u\) 的权值修改为环长,把环上其他点改为 \(0\) ,原来的树的形态是不需要改变的。
查 lca(u,v),就是先 access(u),再在 access(v) 时顺便记下跳到根所在实链时到达的点即可。总时间复杂度 \(O(m\log n)\)。
19.CF1954F Unique Strings
考虑用 burnside 引理来处理这种循环同构的问题。这里有一个坑点,就是若一个等价类存在一个串是合法的,则我们要把整个等价类的串都是合法的,才能正确使用 burnside 引理。也就是说一个 01 串是合法的,当且仅当其存在长度为 \(c\) 的 \(1\) 连续段(环上的)且 \(1\) 个数 \(\le k+c\) 。
现在要做的就是 \(n\) 的每个因数 \(d\) 计算有多少串满足 \(a_i=a_{i+d}\) 且合法。
下文中的“连续段”都是指:把序列首尾相接形成环后的连续段。
注意到除了全 \(1\) 的情况,最长连续段是等于 \(a[1,d]\) 的连续段长度的,于是现在我们只需统计长度为 \(d\) ,最长连续段长度 \(\geq c\) 且 \(1\) 个数 \(\le \frac{(k+c)d}{n}\) 的序列个数。正难则反,计算最长连续段 \(<c\) 的个数。
我们考虑记 \(f_{i,j}\) 表示开头结尾都是 \(0\) ,长度为 \(i\) ,有 \(j\) 个 \(0\) 且最长连续段长度 \(<c\) 的序列个数,这容易通过前缀和优化在 \(O(n^2)\) 时间内算出。统计答案时考虑枚举开头结尾 \(1\) 的个数 \(p(p<c)\) ,令 \(0\) 个数的下界为 \(J\) ,把答案加上 \((p+1)\sum\limits_{j=J}^{d-p} f_{d-p,j}\) 即可。这也可以通过前缀和快速计算。
20.LOJ3666 「JOI 2022 Final」沙堡 2
像这种数合法矩形/合法区域的问题,一个很好的思路是找到一些易于统计的量来转化问题。
eg1: P7295 通过欧拉定理把算联通块转化成了算点+区域-边。
eg2:给你一个值互不相同的矩阵问有多少子矩阵的值是连续的。
其实就是基于这样一个性质:把值在 \([l,r]\) 间的位置染黑后,一定存在 \(\geq 4\) 个 2*2 方格中有奇数个黑色格子,且合法状态一定有恰好四个。这样就很容易利用线段树进行计算了。
回到这个题。先思考怎么 check 一个矩阵合法,就是对每个点,向与它相邻且比它大的点里最小的连一条边。如果刚好连成一条链就 win 了,但“连成一条链”这个东西是很难直接刻画的。但你发现根据连边方式这个肯定是一个内向森林,那只要有恰好一个点入度为 0,就一定是链了。
于是转而统计“恰好一个点入度为 0” 的子矩阵个数。那每个点的入点和什么有关系呢?其实只和以它为中心的 5*5 区域和子矩阵的交有关系!
剩下的部分就不难了,很容易设计出一个 \(O(\min(n,m)nm)\) ,即 \(O(N\sqrt{N})\) 的算法。
21.BJOI2019 送别
一个平凡的思路是把每条边拆成两个点来进行维护,拆出的每个点根据题意都有唯一的后继点,而且一定会形成若干个环,用平衡树维护这些环即可。但这样需要大量分类讨论,很难写清楚。
一个简洁的做法:把每个点拆成四个点,即 \((x-ε,y-ε),(x+ε,y-ε),(x-ε,y+ε),(x+ε,y+ε)\) 这四个点。这样拆了之后在上面连后继仍然有相同的性质,而且考察每次连/删边时发生的变化,你发现它只会交换两个点的后继:以 \((x.y),(x+1,y)\) 为例,它只会交换 \((x+ε,y-ε)\) 和 \((x+1-ε,y+ε)\) 的后继点。
这样问题就变得非常简单,我们容易通过平衡树来维护题目需要的信息。复杂度 \(O(N\log N)\) 。
22.LOJ3494 「JOISC 2021 Day3」保镖
考虑把 \((x,t)\) 转化成 \((t+x,t-x)\) ,则每个保镖相当于从某个起点开始向上/向右走,然后有一个网格图,每个边有边权 \(w\) ,如果在上面走 \(t\) 步权值就会加 \(wt\) ,要得到尽量大的权值。
可以发现走的策略一定是向上走若干步,到某条横线上再往右走到第一个格点 or 先向上再向右,走到这个格点之后就只会沿着网格的边走了,那设 \(dp_{i,j}\) 是从 \(i\) 行 \(j\) 列的点出发得到的最大权值。设 \(X,Y\) 是从这个点往上的第一行和往右的第一列,以第一种走法为例,大概是 \(\max\limits_{i\geq X} dp_{i,Y}+w_{i,Y}(v_Y-y)\) 的形式。枚举 \(Y\) ,从 \(n\) 到 \(1\) 枚举 \(X\) ,那每次会从凸包里加入 \((-w_{X,Y},dp_{X,Y}+w_{X,Y}v_Y)\) 这个点,你发现由于 \(dp\) 数组是有单调性的,我们用栈维护凸包,每次加入点时可以直接把横坐标更大的点弹掉。然后查询时在凸包上二分即可。
复杂度 \(O(n^2+q\log n)\) 。
23.CF1149E Election Promises
感觉像这种公平游戏往往都是对每个状态找出一个易算的权值,满足必败态的权值为零且每次操作权值一定会变化;必胜态一定有操作让权值归零。
这个题就是构造 \(S=\sum\limits_{i}[\oplus_{sg(u)=i}h_u>0]\) 。 \(S=0\) 时显然怎么操作都会让 \(S\) 不为零;\(S\) 不为 \(0\) 时考虑找到最大的 \(i\) 使得 \(\oplus_{sg(u)=i}h_u=t>0\) ,并找出一个 \(u\) 使得 \(sg(u)=i\) 且 \(h_u\) 包含 \(t\) 的最高位,并把 \(h_u\) 改为 \(h_u\oplus t\) ;而对于 \(j<i\) ,根据 sg 函数的定义一定存在 \(u\) 的出边 \((u,v)\) 使得 \(sg(v)=j\) ,修改 \(h_v\) 使得条件满足即可。
24.P10222 [省选联考 2024] 最长待机
翻译题意的部分 too hard for me,写一下翻译后的结果:计算 \(D_u=\max\limits_{v}D_v+e_u\) 对每次查询按 dfn 依次找到那些 \(e_u=1\) (或叶子)且没有祖先 \(f\) 使得 \(e_f=1\) 的点,如果 \(D_u\) 不小于之前最大的 \(D\) ,就把 \(\max(D_u,1)\) 加进答案。然后如果这个过程不止一个 \(u\) 有效,还要再加 \(1\) 。
思考怎么做子树查询。我们可以构造一个类似于欧拉序的序列 \(a\):dfs(u) 时先把 \(u\) 加进序列末尾,然后依次儿子 \(v\) ,dfs(v) 并把 \(u\) 再次加入序列末尾。然后维护 \(d_i\) 为 \(1\) 到 \(a_i\) 中 \(e=1\) 的点个数,那修改就是做一个区间修改。考虑查询,首先 \(u\) 为叶子是很好处理的;剩下的部分实际就是:对于一个区间,按照其中的最小值把区间分成若干段,计算每一段的最大值形成一个序列,计算这个序列所有前缀最大值之和。用楼房重建 trick 计算即可。判断系数为 \(1\) 也挺简单,就是再线段树二分几遍,找到需要的信息。复杂度 \(O(n\log n+q\log^2n)\) 。
感觉这种题因为步骤繁多,很容易在其中某个环节出问题,而且有些可以瞪眼解决,有些纯粹是你细节上思路有一点问题,就很难调。感觉就是,不要太急躁了,先打个草稿理一理。
25.P8367 [LNOI2022] 盒
不难发现可以转化成算 \(f(n,m)=\sum\limits_{i\le n}\tbinom{i}{m}\tbinom{a-i}{b-m}\) ,其中需要的 \((n,m)\) 形成了一个往右往上的路径。对单项快速算是困难的,但我们可以尝试快速的从 \(f(n,m)\) 推到 \(f(n+1,m)\) 和 \(f(n,m+1)\) 。推到 \(f(n+1,m)\) 是容易的;推到 \(f(n,m+1)\) 的话,并没有方便的推式子做法,但不难发现 \(f(n,m)\) 的组合意义:在 \(a+1\) 个盒子中放 \(b+1\) 个球,使第 \(m+1\) 个球位置 \(\le n+1\) 。那么 \(f(n,m)-f(n,m+1)\) 就等于第 \(m+1\) 个球位置 \(\le n+1\) ,第 \(m+2\) 个球位置 \(>n+1\) 的方案数,这显然等于 \(\tbinom{n+1}{m+1}\tbinom{a-n}{b-m}\) 。这个题就做完了。
26.ARC175F Append Same Characters
其实主要难点就是关于 \(S^{\infty}\) 的结论知不知道吧:就是比较 \(X^{\infty}\) 和 \(Y^{\infty}\) 等同于比较 \(XY\) 和 \(YX\) :若 \(XY=YX\) 则 \(X^{\infty}=Y^{\infty}\) ,否则 \(lcp(X^{\infty},Y^{\infty})=lcp(XY,YX)\) 。
证明就是分类讨论吧,似乎没有什么优雅的证法。然后回到这个题,你发现只有前后缀关系的串的大小关系会发生改变:设这两个串是 \(A\) 和 \(A+B\) ,那只要往后接的串 \(>B^{\infty}\) 就会发生改变。而这样的 \(B\) 一定是某个给出串的后缀,只有 \(O(\sum |S|)\) 个,把它们的权值通过 trie 算出来,按 \(B^{\infty}\) 排序即可计算出答案。
27.CF1276F Asterisk Substrings
比较难计算的就是 S*T 的个数,我们枚举 S ,那可能的 T 只和 S 的 endpos 有关系。建出正反串的 SAM,对于正串的一个节点,我们就需要计算:对于所有属于该点 endpos 集合的 \(x\) ,\(x+2\) 在反串上代表的节点在 fail 树上的链并。链并就是经典的按 dfn 排序后用深度和减掉相邻点的 lca 的深度。而现在有一个合并 endpos 集合的过程,可以利用线段树合并/启发式合并来计算新的权值,复杂度 \(O(n\log n)\) 。
我觉得串题的难度就在于找到一个正确的枚举方式来运用上你所学的知识。
28.AGC008F Black Radius
我们希望每个点集都能被唯一的统计到,肯定是希望在这个点集直径的中心处统计到。
于是枚举这个中心 \(u\),看看有多少可能的半径 \(r\)。成为中心的条件是在 \(u\) 的至少两个子树的点深度是 \(\geq r-1\) 的,否则我们可以调整成最深子树的顶点。而我们也不能算进去全集,于是设最深的为 \(M\) ,次深的为 \(S\) ,则 \(r<\max(S+2,M)\) 。
但 \(u\) 不是关键点时怎么办呢,若我们选择了一个替代的关键点,那 \(r\) 肯定要 \(\geq\) 它所在子树的深度。于是设 \(u\) 有关键点的子树的最小深度为 \(L\) ,就有 \(r\geq L\) 。
容易用树形 dp 处理出需要的东西,复杂度 \(O(n)\) 。
29.P5417 [CTSC2016] 萨菲克斯·阿瑞
先思考怎么 check 一个 sa 数组能不能被构造出来,你发现我们能根据 \(sa_i,sa_{i+1}+1\) 的 rank 关系得到 \(c_{sa_i}\le c_{sa_{i+1}}\) 或 \(c_{sa_i}<c_{sa_{i+1}}\) 的限制,最后就形成了 \(c_{sa_1}\) 到 \(c_{sa_n}\) 的不等式链。贪心的往上填就好了。
那我们不妨枚举不等式链的形态,思考怎么计算有多少 sa 数组得到的链会长成这个样子。
直接算是困难的,但如果我们不去考虑链中的小于号,你发现这就变得好算了起来:
不妨令此时链形成了长为 \(x,y,z\) 的三段。有结论: \(x\) 个 A,\(y\) 个 B ,\(z\) 个 C 的串和合法的 sa 形成一一对应的关系,这是不难说明的:每个串对应的 sa 显然互不相同,而合法的 sa 也不会被算漏,一定会被满足 \(c_{sa_1}=c_{sa_2}=..=c_{sa_x}=A,c_{sa_{x+1}}=c_{sa_{x+2}}=..=c_{sa_{y}}=B\) ,剩下的等于 \(C\) 的串算到。
再考虑小于号,容斥即可解决。剩下的部分就是常规的 dp 了。
30.CF700E 不需 SAM 的做法
考虑这样一个暴力的思路,就是从单个字母开始直接 dfs,我们记下来一个串 \(S\) 在 \(T\) 中所有的出现位置,那么取的下一个串一定是相邻的两个出现位置 \(p,q\) 拼起来的结果(即 \(T[p,q+|S|-1]\) ),否则是不优的,于是把这些可能的串离散化出来并 dfs 下去。直接做是 \(O(n^2\log n)\) 的,会递归 \(O(n)\) 层,每层复杂度由于离散化是 \(O(n\log n)\) 的。
考虑优化,我们注意到对于相邻的三个出现位置 \(x,y,z\) ,若 \(y-x=z-y<|S|\) ,那么 \(x,y\) 拼起来的串和 \(y,z\) 拼起来的串是相同的,于是我们考虑,不直接把所有出现位置记下来,转而记下第一个出现位置以及其差分数组的连续段。(\(\geq |S|\) 的部分不要连到一起)。
接下来分析这样的复杂度,对于差分 \(>\frac{|S|}{2}\) 的部分,拼出的串串长变成原来的 \(\frac{3}{2}\) 倍;对于 \(\le\frac{|S|}{2}\) ,你发现不存在两个相邻位置满足同时 \(\le \frac{|S|}{2}\) 且不相等,这是不符合 border 理论的!那么这样的段的总数就不超过原来的段的一半。
也就是说我们递归下去的每一层,要么长度翻倍,要么总量不超过原来的一半,所以只会递归 \(O(\log n)\) 层。复杂度即为 \(O(n\log^2n)\) 。
31.gym103469I Intellectual Implementation
三个矩阵两两不交感觉不好算,正难则反,考虑三个矩阵两两相交是好算的,用点边容斥就好了,转化成对每个 \((x,y)\) 计算包含它的矩阵数量 \(c\) 的 \(\tbinom{c}{3}\) 之和。你扫描线一下,支持区间加,全局查 \(\sum \tbinom{a_i}{3}\) ,我们每个节点维护 \(\sum a^2\) 和 \(\sum a\) 就好了,在修改时计算新的全局 \(\sum\tbinom{a_i}{3}\) 即可。
考虑至少有一对矩阵相交的三元组,不妨枚举所有可能的连边情况,你发现有 1=#[边]-#[有两条边相连的点个数]+#[三元环]。我们已经知道 #[三元环]的计算方法了。考虑另外两个东西,不妨计算 \(a_i\) 为与 \(i\) 相交的矩阵个数,这可以二维偏序解决;那么 #[边] 之和就是 \((n-2)\frac{\sum a_i}{2}\) ,#[有两条边相连的点个数] 就是 \(\sum\tbinom{a_i}{2}\) 。
复杂度 \(O(n\log n)\) 。
32.P6700 [PA 2015 Final] Edycja
首先单点改的操作肯定是拿到最后进行。若指定了单点改的位置,剩下的部分只能用转字符操作,那每个字符只能有至多一种目标字符,考虑把这个建成图来,考虑每种联通块,你发现每个联通块的操作数基本都等于边数,只是纯环处需要多 1 次操作,且必须依赖一个非纯环的联通块。还有就是自环不需要操作。
现在思考怎么确定单点改的位置,我们算出 \(v_{i,j}\) 为 \(A_k=i,B_k=j\) 的个数加上 \(C*[i\neq j]\) ,那我们贪心的对每个 \(i\) 指定 \(nxt_i\) 为 \(v_{i,j}\) 最小的 \(j\) ,再这个基础上进行调整。
你发现这是有良好的性质的,我们不需要考虑调整出的新环,因为这即使不算环带来的费用也是更劣的:把其中一条调整回原来的样子即可。
于是我们在调整的过程中只需记录原来的环中,有哪些被破掉了/不是纯环了。于是记 \(dp_{i,S,0/1}\) 为考虑前 \(i\) 个点,被破坏的原环集合为 \(S\) ,\(0/1\) 为是否有非纯环了。
注意这里我们并不需要考虑自环,于是环的个数 \(\le \frac{n}{2}\) ,复杂度即为 \(O(n^22^{\frac{n}{2}})\) 。
33.qoj8047 DFS Order 4
先思考怎么 check 一个 dfn 序是否合法,就是维护当前 \(1\) 到 \(p_{i-1}\) 的链,每次把末尾大于 \(>p_i\) 的部分弹出,在倒数第二个点接上 \(p_i\) 。
转为对树的统计,可以发现上面的事情相当于:对于 \(u\) 相邻的儿子 \(a,b\) ,\(a\) 的最后一个儿子\(v>b\),否则按照贪心的方法我们会把 \(b\) 接到 \(v\) 下面。还有就是 \(a\) 不能是叶子,不然 \(b\) 也可以接到下面。
那这个东西怎么统计呢,考虑若枚举树的形态怎么计算填标号的方法,相当于是 dag 拓扑序计数:\(u\) 连向第一个儿子,\(a\) 连向 \(b\) ,\(b\) 连向 \(v\) 。这是不好算的,但如果是外向树就好了。
考虑容斥,即 \([v>b]=1-[v<b]\) ,转化成 \(v\) 连向 \(b\) ,此时你发现 \(a\) 连向 \(b\) 的边就能断掉了,这样就转化成外向树了!我们知道,此时的方案为 \(\frac{n!}{\prod sz_i}\) 。
现在思考 dp ,设 \(dp_{i,j}\) 为,根的最后一个儿子被接了一个大小为 \(j\) 的子树后所有情况的系数和,注意这里不算进去那个额外的子树的 \(\frac{1}{\prod sz_u}\) ,也不算进去根的 \(\frac{1}{i}\) (为了方便),那枚举原树中第一个儿子的子树大小 \(k\),我们有 \(dp_{i,j}=\frac{1}{i+j-1}(dp_{i-1,0}+\sum\limits_{k=2}^{i-1}(dp_{k,0}-dp_{k,i-1-k+j})dp_{i-k,j})\) ,其中 \(k\geq 2\) 来自 \(a\) 不能是叶子的限制, \(dp_{i-1,0}\) 是只有一个儿子的情况。
答案即为 \(dp_{n,0}(n-1)!\) ,复杂度 \(O(n^3)\) 。
34.P9537 [YsOI2023] CF1764B
挺有意思的博弈。首先观察到两个集合大小差太多的时候胜负已决,具体的,令先手集合为 \(S\) ,后手集合 \(T\) ,那 \(|S|\geq |T|+2\) 时,先手每次都能造出至少 \(|S|-1\) 个不同的数,所以一定有一个不在 \(T\) 中出现,先手即必胜。同理 \(|S|<|T|\) 时先手操作一步后就有 \(|T|\geq |S|+2\) ,于是后手必胜。
现在分析 \(|S|=|T|+1\) ,首先先手一步都操作不了肯定就输了,也就是 \(S=\{a+td|0\le t<n\}\) ,\(T=\{td|1\le t<n\}\) 。否则的话,由于终止状态还得是上述的形式,那么一轮操作后 \(S\) 中一定有 \(d\) 倍数,也就是说对于终止状态,一定有 \(d|a\) 。令 \(a=kd\) 。
再观察一下,考虑 \(S\) 终止状态中最大的两个数 \((k+n-1)d,(k+n-2)d\) 一定都是在初始状态中就有的,因为 \(T\) 能造出的数始终 \(\le (n-2)d\) 。所以合法的初始状态的必要条件有:\(S\) 中最大的两个数分别为 \(td,(t+1)d\) 且 \(T\) 中所有数 \(\le td\) ,\(S,T\) 中所有数为 \(d\) 倍数。
你发现这是充分的!因为考虑后手操作时一定有 \(|S|=|T|=z\) ,于是后手能造出 \(z-1\) 个 \(\le (n-2)d\) 的数,而由于 \(S\) 中最大的两个数的存在,其 \(\le (n-2)d\) 的数只有至多 \(z-2\) 个!
整理一下,\(|S|=|T|+1\) 且先手输的条件是:先手一开始就动不了 or 先手最大的两个数形如 \(td,(t+1)d\) 且后手最大数 \(\le td\) ,且所有数是 \(d\) 的倍数。
第一个情况可以先枚举 \(d\) 再枚举长度 \(t\),令可取数的 bitset 为 \(A\) ,把 \(A\) 左移 \(kd(k\le t)\) 都并起来即可得到合法的位置了。注意这里要刨去 \(a\) 为 \(d\) 倍数的情况。
第二个情况还是枚举 \(d\) ,相当于要算一个 \(\sum\tbinom{c}{x-1}\tbinom{c+1}{x}\) ,这是等于 \(\tbinom{2c+1}{c}\) 的。
再考虑 \(|S|=|T|\) 的情况,你发现这个时候先手很难赢,即一步之后要让 \(S\) 中所有数 \(\le td\) 且 \(T\) 中最大两数为 \(td,t(d+1)\) ,但你你发现 \(S\) 走的这一步并不能影响胜负。所以就和之前的计算是类似的了。
复杂度主要来源于 bitset 的操作,为 \(O(\frac{n^2\log n}{w})\) 。
启发就是对于这种摸不着头脑的过程,先分析一下终止状态是怎么样的。
35.qoj8543 Periodic Sequence
首先可以观察到 \(|S_1|=n\),否则可以往前接,然后手玩一下可以发现后面的串一定都是若干个 \(S_1\) 的前缀拼接而成的,且第一个前缀得是最长的。
于是答案的上界为 \(x_1=\max(x_1,x_2,\dots,x_i)\) 且 \(\sum x_i=n\) 的序列个数,可以构造说明这是能卡到的。how kevin's mind work?
考虑枚举 \(k=x_1\) ,\(k\le \sqrt{n}\) 时直接暴力背包;\(k>\sqrt{n}\) 时考虑写成生成函数的形式,即 \(\frac{x^k}{1-x}\frac{1}{1-\frac{x-x^{k+1}}{1-x}}=\frac{x^k}{1-2x-x^{k+1}}=\sum\limits_{j\geq 0}(-1)^j\frac{x^{kj+k+j}}{(1-2x)^{j+1}}\) 。转换枚举顺序,我们从大到小枚举 \(j\) ,可以发现这里 \(j\) 的上界是 \(\sqrt{n}\) 的;我们维护一个当前的系数 \(f\) ,每次让 \(f_{kj+k+j}\) 加上 \((-1)^j\) ,再做一个乘上 \(\frac{1}{1-2x}\) 的操作,这是容易实现的。
复杂度 \(O(n\sqrt{n})\) 。
36.Petrozavodsk Winter 2021. Day 7. North American Contest 1
B. One More Problem About DFT
考虑 \(\sum\limits w^{ik+kj}=n[i+j\bmod n=0]\) 。那么 \(m\) 为偶数时做法容易;\(m\) 为奇数时可以转化为只做一次 DFT。然而由于这里是不定长的,我们转成 \(a'_j=\sum a_iw^{\tbinom{i+j}{2}-\tbinom{i}{2}-\tbinom{j}{2}}\) ,做一遍差卷积即可,用 MTT 实现。
D.The Hash Table
先转化成求 \(0\le x<y<n\) 且 \((x-y)(x+y)\equiv 0\pmod m\) 的 \(x,y\) 对数。
枚举 \(d=\gcd(y-x,m)\) ,则需要 \((x+y)\bmod \frac{m}{d}=0\) 。这个 gcd 怎么处理呢,枚举 \(d|d_2\) ,我们计算 \(d_2|y-x,\frac{m}{d}|y+x\) 的对数,乘上 \(\mu(\frac{d_2}{d})\) 加到答案里。
那么问题就转化成快速计算 \(a|y-x,b|y+x\) 的对数了。令 \(ap=y-x,bq=y+x\) ,我们先枚举 \(p=2p'+c,q=2q'+d(0\le c,d<2)\) ,若奇偶满足条件,则就是求一个 \(bq'\geq ap'+M,ap'+bq'\le N,p',q'\geq 0\) 的解个数,这是经典问题,可以类欧解决。
E.Happiness
题意是真绕啊。
先翻译一下题意,相当于序列 \(p\) ,初始 \(p_i=i\) ,有两种操作,一种是对 p 整体加(模 \(n\)),一种是单点改 \(p\) ,然后支持询问全局的 \(\sum a_{p_i}\) 。
考虑根号重构,每次重构时利用卷积计算出 \(f_i\) 为整体加 \(i\) 后的答案,每次查询假设整体加了 \(i\),那么用 \(f_i\) 再加上所有单点改操作带来的影响即可。
这样复杂度即为 \(\frac{qn\log n}{B}+qB\) ,不妨令 \(n,q\) 同阶,那么 \(B=\sqrt{n\log n}\) 即可平衡至 \(O(n\sqrt{n\log n})\) 。考虑到 NTT 的常数,再把 \(B\) 调大一点是更优的。
F.The Hash Table
不难发现可以把景区的贡献分成两部分,一部分是对 \(l\le x\le r\) ,其距离与 \(y^2\) 取 min,一部分是对 \(x\in R\) ,距离与 \(y^2+(x-l)^2,y^2+(x-r)^2\) 取 min。第一部分容易扫描线+set 解决,我们会得到 \(O(n)\) 个分界点,对于第二部分,整理成 \(x^2+bx+c\) 的形式,求出 \((-b,c)\) 的下凸包即可找出有用的点,并利用相邻二者间的斜率找到分界点。
两个分界点间的部分,就是解 \(x^2+bx+c\le 0\) ,这是初三(二?)数学。
M.Number of Colorful Matchings
鉴定为 \(det(A+Bz)\) ,只是模数为 \(2\) 。
37.gym103470F Paimon Polygon
可能是退役前最后一个算几。
对于两个凸包为包含关系的情况,考虑 \(A\cup \{O\}\) 一定为 \(S\cup\{O\}\) 的严格凸包,这样我们就分出了 \(A,B\) ,权值容易计算,不过注意看两个凸包有没有退化,以及 \(B\) 中是否有点刚好踩在外层的凸包上,这不难二分判断。
对于相离的情况,先把这些点按极角排序,对每个点分别求出它往右/往左扫,最多能扫到哪个点,使得中间不存在下凹的情况且二者极角之差 \(<\pi\) ,我们记为 \(L_i,R_i\) ,这里为了方便我们不妨把这个点的序列倍长。考虑最后的图形一定是从这些点围成的多边形,删去两条边,再添上两对连向 \(O\) 的边形成的。求出 \(v_i\) 为 \(dis(A_i,O)-dis(A_{i+1},O)-dis(A_i,A_{i+1})\) ,那么若断掉 \((i,i+1)\) ,则另一个边 \(j\) 需要满足 \(i+2\le j\le n+i-2\) 且 \(j\le R_{i+1},L_{n+i}\le j+1\) 。 合法的 \(j\) 形成了一个区间,我们查其中 \(v_j\) 的最大值即可,可以 ST 表实现。
38.CF1965F Conference
尝试用霍尔定理判断。你发现如果 \(l,r\) 互不相等,那考虑当前取的集合 \(S\) 构成若干个区间,我们随便找一个区间往外拓展,\(N(S)\) 只会至多 +1。于是 \(S\) 取全集是最优的,根据这个也能发现: \([l,r]\) 不合法则 \([l,r-1],[l,r+1]\) 不合法,于是双指针即可计算答案。
然后你发现如果存在一对 \([a,b],[a,c](b\le c)\) ,把 \([a,c]\) 改成 \([a+1,c]\) 是不劣的。因为第一个区间选 \(a<x\le b\) ,第二个区间选 \(a\) 时可以直接交换。这里有点像 NOI2022 冒泡排序中的一步。
这个改 \(l,r\) 的过程是不难实现的,复杂度 \(O(n\log n)\) 。
39.LOJ3658. 「2021 集训队互测」匹配计数
4 月最后一题。
首先可以观察到对一条线,与之相交的线数奇偶性和其内部选的点个数相同。那考虑两个不同颜色间的交点个数的奇偶,你发现这只和所选的位置有关系,具体的,令 \(S_i\) 为颜色 \(i\) 所选位置的下标集合,则这个奇偶性等同于 \(\sum\limits_{x \in S_i}\sum\limits_{y\in S_j}[x<y]\) 。再把所有颜色内部连法的系数和乘起来,但你发现这个系数都等于 \(1\) ,这容易归纳说明:我们知道 \(n-2\) 是满足的,那当前考虑 \(1\) 和谁相连,有 \(\frac{n}{2}\) 种系数为正,\(\frac{n}{2}-1\) 种为负,一减就等于 \(1\) 了。
那问题就转化成,选一个集合 \(S\),需要每个颜色被选偶数次,令 \(A_{x,y}=[a_x<a_y](x<y)\) ,则其系数为 \((-1)^{\sum\limits_{x,y\in S}A_{x,y}}\) ,求所有集合系数之和。
考虑去掉选偶数次的限制,我们新加 \(n\) 个点,然后令 \(A_{i,a_i+n}=1\) ,这样如果一个颜色 \(i\) 选了奇数次,那 \(i+n\) 的两种选法系数就抵消了,否则会让原答案乘上 \(2\) 。于是我们最后除掉 \(2^n\) 即可,现在就去掉了 \(S\) 的限制。
最后考虑式子的计算,不妨把答案写成 \(\sum (-1)^{\sum\limits_{i,j}x_ix_jA_{i,j}}\) ,其中 \(x_i\in \{0,1\}\) 。我们尝试把问题递归到更小的情况,于是我们考虑先确定 \(x_2,x_3,\dots,x_n\) 后 \(x_1\) 对系数的影响。
令 \(P=\sum\limits_{j>1}A_{1,j}x_j\) ,那若 \(P=0\) 则答案乘 \(2\) ,否则就抵消了。所以相当于给出了一个形如 \(\sum\limits_{i\in S}x_i=0\) 的限制。若 \(S\) 为空就直接递归到去掉 \(x_1\) 的情况,否则任取 \(S\) 中的一项 \(t\) ,把 \(x_t=\sum\limits_{i\in S-\{t\}}x_i\) 代到式子中即可,这样就递归到了删去 \(1,t\) 的情况中。上面的推导基于 \(A_{i,i}=A_{t,t}=0\) ,如果不为 \(0\) 还要再讨论一下,其实也是差不多的。最后这个代入的过程可以用 bitset 优化,于是复杂度 \(O(\frac{n^3}{w})\) 。