2026.6 做题记录
1 QOJ5528
将 \(K_n\) 拆成 \(n-1\) 组完美匹配。方法是令 \(V=\{+\infty,0,1,\cdots,n-2\}\)。对于每个 \(i \in [0,n-2]\),令 \(E_i = \{(+\infty,i)\} \cup \{(i-j,i+j)\mid 1 \leq j \leq \dfrac{n}{2}-1\}\),其中下标模 \(n-1\) 意义理解,则 \(E_0,E_1,\cdots,E_{n-2}\) 即为 \(n-1\) 组不交完美匹配。
我们发现依次考虑 \(E_0,E_1,\cdots,E_{n-2}\),按照先染 \((i-j,i+j)\),后染 \((+\infty,i)\),颜色从 \(1\) 开始依次往上,即符合原题要求。
\(n\) 为奇数时删去 \(+\infty\) 即可。
2 QOJ5523
枚举 \(i\),先考虑朴素的 DP。\(f_{S,j}\) 表示从 \(i\) 出发的路径经过了 \(S\) 内所有点恰一次,并最终结束在 \(j\) 是否可行。转移枚举 \(j\) 的邻居 \(x\) 满足 \(x \notin S\),并转移到 \(f_{S \cup \{x\},x}\),复杂度 \(O(2^nn^2)\),加上枚举 \(i\) 复杂度就是 \(O(2^nn^3)\)。
首先我们可以将其优化至 \(O(2^nn^2)\)。直接用一个 int 储存 \(f_{S,*}\)。同时 FWT 出 \(v_{S}\) 表示 \(S\) 内的点的邻居集合的并。那么直接枚举 \(v_{f_S}\) 内的点 \(x\) 即可转移。复杂度 \(O(2^nn^2)\),对于 \(i\) 的单次 DP 是 \(O(n2^n)\) 的。
注意到任意一条哈密顿路径必然经过点 \(1\),于是直接令 \(i=1\) 做这个 DP,复杂度 \(O(2^nn)\),那么判定 \(i,j\) 相当于判断是否存在集合 \(S,T\) 满足:
- \(i \in S,j\in T\)。
- \(S \cup T = V\),\(S \cap T = \{1\}\)。
- \(f_{S,i} = f_{T,j}=1\)。
枚举 \(S\),可得唯一的 \(T\)。然后枚举 \(i\),\(ans_i \gets ans_i \cup f_{T}\) 即可。
总复杂度 \(O(n2^n)\)。
3 QOJ17476
按照 \(b\) 离线依次激活,线段树维护即可。
4 ARC221B
每个点的值为 \(s_i\),有解当且仅当建立有向图 \(G\),对于每个 \(i\),对所有 \(j \in s_i\),连边 \(i \rightarrow j\)。图的每个环上的 \(s_i\) 均相同。
也就是按照 \(s\) 合并等价类后图是 DAG。
对此直接类似有标号 DAG 计数的容斥做法即可。容斥时先枚举入度为 \(0\) 的等价类个数再枚举他们的点数和,方案是一个 \(2\) 的次幂乘以第二类斯特林数状物。复杂度 \(O(n^3)\)。
5 ARC221A
注意到 \(\gcd(ai+b,ci+d)\) 可以不断辗转相除直至变为 \(\gcd(x,yi+z)\),过程是类似的,也就是将两个一次式进行辗转相除,这其实是辗转相除在整系数多项式上的推广。
现在问题变为求 \(\sum \limits_{i=1}^n \gcd(x,yi+z)\)。枚举 \(x\) 的因数 \(a\),只需要计算有多少 \(i \in [1,n]\) 使得 \(a \mid yi+z\)。这个只要做一下 exgcd 求同余方程即可。
6 P13691
这好像是个经典题,应该是某个 JOI 弱化版。
如果只有一类花费直接倍增即可。\(f_{i,j}\) 表示从 \(i\) 开始走 \(2^j\) 步所到的最远位置。看起来转移需要求 \(f_{*,j-1}\) 的区间 \(\max\),但实际上这个 \(\max\) 位置就是原序列的 \(r_i=i+v_i\) 的区间 \(\max\),这是因为再走一步肯定希望范围最大。
对于二类花费,类似的考虑倍增,但是 \(2^j\) 不一定是两个 \(2^{j-1}\) 而有可能是 \(\left(2^{j-1}-1\right)+2+\left(2^{j-1}-1\right)\)。此时增加状态。\(g_{i,j}\) 表示从 \(i\) 开始走 \(2^{j}-1\) 步最远的点。那么 \(2^j=2^{j-1}+2^{j-1}\) 或 \(\left(2^{j-1}-1\right)+2+\left(2^{j-1}-1\right)\)。而 \(2^j-1=2^{j-1}+\left(2^{j-1}-1\right)\) 或 \(\left(2^{j-1}-1\right)+2^{j-1}\)。至此可以转移。
查询是类似的。
ST 表预处理原序列区间 \(\max\),总复杂度 \(O((n+q)\log n)\)。
7 QOJ17470
对于集合 \(S\) 询问 \(S\) 和 \(\bar{S}\) 并将返回值求和,那么两端在 \(S\) 和 \(\bar{S}\) 之间的边被贡献两次,而 \(S\) 和 \(\bar{S}\) 内部的边均被贡献一次。
对于每个 \(i \in [1,2^n)\),令 \(S_i=\{j \mid \mathrm{popcount}(j \operatorname{and} i) \equiv 1 \pmod 2\}\),询问 \(S_i\) 和 \(\bar{S_i}\)。将所有 \(2^{n+1}-2\) 个答案求和,并除以 \(3 \times 2^{n-1}-1\) 即为答案。
接下来我们说明算法的正确性。
首先说明对于任意 \(i \in [1,2^n)\),有 \(|S_i| = 2^{n-1}\)。对于 \(i\) 中为 \(1\) 的位,\(j\) 必须要有奇数个位置为 \(1\)。设 \(\mathrm{popcount}(i)=c\),则当 \(c>0\) 有 \(2^{c-1}\) 种选法。所以 \(|S_i|=2^{c-1}\times 2^{n-c}=2^{n-1}\)。
接下来说明每条边被贡献 \(3 \times 2^{n-1}-1\) 次。
考虑边 \(u,v\),满足 \(u \neq v\),考虑其被贡献的次数。对于二进制第 \(i\) 位,若 \(u\) 和 \(v\) 这一位二进制相同,则 \(i\) 这一位无论选什么都不会对他们的奇偶性是否相同造成影响。而有 \(c\) 位不同,那么 \(2^{c-1}\times 2^{n-c}\) 个 \(i\) 的贡献是 \(1\),其他是 \(2\),但要减去 \(i=0\) 的贡献,总共 \(3 \times 2^{n-1}-1\) 次。
问题解决,询问次数 \(2^{n+1}-2\)。
8 P16613
树上圆理论。
考虑任意时刻 \(S\) 直径距离不超过 \(D\)。所以大概是一个半径为 \(\dfrac{D}{2}\) 的树上圆。为了方便讨论我们将每条边中间加一个点,这样圆的半径是整数。
\(r\) 全局确定。任意时刻 \(S\) 为某个圆 \((u,r)\) 的一个子集。操作过程中圆心移动是连续的。所以问题变为我们要找一条路径 \(p_1,p_2,\cdots,p_m\),满足 \(S \subseteq \odot (p_1,r)\),\(T \subseteq \odot (p_m,r)\)。另外我们希望路径上相邻两个点的圆心可以转移,这至少需要满足 \(\forall i\in [1,m-1]:|\odot (p_i,r) \cap \odot (p_{i+1},r)| \geq k\)。事实上这也是充要条件,因为你可以每次删一个叶子向外扩展一下之类的。
9 P15925
没有相邻相同容斥成选若干 \(i,i+1\) 相同。这样从前往后 DP 就行了。
10 P15916
类似矩阵乘法,考虑矩阵乘法那一套,直接看是 \((\min,+)\) 广义矩阵乘法,但是显然无法真正维护路径字典序。具体来说类似 SA 做的那一套,我们比较字典序先将之前的离散化得到排名做双关键字比较就行了。这样我们就可以套用矩阵快速幂的想法做倍增状物了。
11 QOJ17469
一个合法凸多边形肯定有一个 \(\texttt{()()}\) 子串,所以只需要找到一个依次为 \(\texttt{()()}\) 的凸多边形。
如果将同字符的点两两连边,没有三点共线,所以问题转化为是否存在一条 \(\texttt{(}\) 和一条 \(\texttt{)}\) 的线段有交。
枚举四个点中 \(x\) 最大的一个点。如果有 \(x\) 坐标相同的点可以随机旋转。对左侧同色点 \(j\) 希望判定左侧是否存在异色线段和线段 \(p_jp_x\) 有交。只需要对左侧异色点建凸包并判定这条线段是否和凸包有交。这个只需要将凸包上的点和 \(i\) 连边的斜率求出来,询问时二分找直线的斜率在哪个区间内。复杂度 \(O(n^2 \log n)\)。
12 QOJ17763
\(k(a+b) \equiv ab \pmod n \iff (a-k)(b-k) \equiv k^2 \pmod n\)。
考虑 \(w=k^2\),\(x=a-k\),\(y=b-k\)。计数 \((k,a,b)\) 和计数 \((w,x,y)\) 是等价的。对于 \(w\) 考虑计算有多少 \(0 \leq x,y < n\) 使得 \(xy \equiv w \pmod n\)。
固定 \(x\),解方程 \(xy \equiv w \pmod n\),等价于 \(xy + kn = w\)。有解当且仅当 \(\gcd(x,n) \mid w\),若有解,解的个数就是 \(\gcd(x,n)\)。
枚举 \(\gcd(x,n)=d\),需要计算 \(\sum \limits_{k=0}^m [d \mid k^2]\)。将 \(d\) 分解质因数后令 \(z = \prod p_i^{\lceil \frac{\alpha_i}{2}\rceil}\),则要求即为 \(z \mid k\)。而 \(\gcd(x,n)=d\) 的 \(x\) 个数即为 \(\varphi(\dfrac{n}{d})\)。这些计算都和质因数有关,考虑将 \(n\) 质因数分解后逐个质因子枚举指数 DFS。复杂度 \(O(\sqrt n)\)。
13 QOJ5573
记 \(f_i\) 表示只考虑前 \(i\) 个点的意义下的周期。在 \(i\) 从 \(1\) 到 \(n\) 的同时维护 \(g_i\) 表示一个周期下点 \(i\) 的最终值会为多少。
每次 \(i \gets i+1\) 时,新的周期为 \(\dfrac{f_ic_{i+1}}{\gcd(g_{i+1},c_{i+1})}\),然后更新之后的 \(g\) 即可。
14 QOJ17755
按 \(m\) 归纳。在 \(m\) 时假设有 \([m]\) 的划分 \(S_1,S_2,\cdots,S_n\) 满足题意,我们要证明加入 \(m+1\) 后依然存在集合满足题意。我们的想法是先对 \(S_1,S_2,\cdots,S_n\) 进行调整,然后选择一个 \(i\),\(S_i \gets S_i \cup \{m+1\}\)。
建立有向图 \(G\),\(V=[n]\),对于每个 \(i \neq j\),若 \(u_i(S_j) > u_i(S_i)\),则连边 \(i \rightarrow j\)。我们先进行调整使得图 \(G\) 没有环。具体来说考虑图 \(G\) 的一个环 \(c_0\rightarrow c_1 \rightarrow c_2 \rightarrow \cdots \rightarrow c_{k-1} \rightarrow c_0\)。令 \(S'_{c_i} = S_{c_{(i+1) \bmod k}}\)。发现这个环被消去。不断执行操作直至图 \(G\) 没有环。
对于没有环的图 \(G\),存在点 \(i\) 使得其入度为 \(0\)。接着执行 \(S_i \gets S_i \cup \{m+1\}\) 即可,不难说明其符合题目限制。加入 \(m+1\) 后,对每个 \(j \in [1,n]\) 询问 \(u_j(S_i)\),询问次数不超过 \(nm\)。
15 QOJ6308
考虑哪些位置可能有 \(c_{x-1} \neq c_x\)。对于 \(i,j\),若 \(l_i < l_j < r_i < r_j\),如果 \(c_{l_j-1} \neq c_{l_j}\),那么 \(i\) 比 \(j\) 先操作。如果 \(c_{r_i} \neq c_{r_i-1}\),那么 \(j\) 比 \(i\) 先操作。所以 \(l_j\) 与 \(r_i\) 不能同时选。
那么选的点合法的一个必要条件是其成为独立集。可以说明其也是充分条件,只需证明按照上述要求不会导致所有区间的先后顺序成环。
由于 \(l,r\) 互不相同,而连边只在 \(l,r\) 之间,问题变为求二分图最大独立集,点数 \(O(n)\),边数 \(O(n^2)\),bitset 优化匈牙利可以做到 \(O(\dfrac{n^3}{w})\),可以通过。
16 QOJ6354
将所有点按度数从小到大排序,将无向边定向为小向大连边。可以发现每个点的出度是 \(O(\sqrt m)\) 级别的。
枚举 \(K_4\) 中排名最靠前的点 \(a\),类似三元环计数,可以在总复杂度 \(O(m\sqrt m)\) 的复杂度内求出每个 \(a\) 的其出发的所有三元环。建立新的图,点集是 \(a\) 的所有邻居,边集是满足 \((u,v,a)\) 构成三元环的所有 \((u,v)\)。那么包含 \(a\) 的这个 \(K_4\) 转化为一个三元环。对于 \(n\) 个点 \(m\) 条边的图直接 \(O(\dfrac{nm}{w})\) 计算三元环个数即可。
现在分析时空复杂度。\(n_a = d_a = O(\sqrt m)\),\(\sum m_a\) 为三元环个数 \(= O (m \sqrt m)\),总时间复杂度 \(O(\dfrac{m^2}{w})\)。而空间复杂度是 \(O(d^2) = O(m)\) 的。可以通过。
17 P13690
考虑一个贪心过程。维护 \(1\) 到 \(n\) 的区间划分 \([l_1,r_1],[l_2,r_2],\cdots,[l_m,r_m]\)。对于每个区间 \([l,r]\),若只考虑 \(l\) 到 \(r\) 的点的诱导子图,\(p\) 与 \(p+1\) 不连通,其中 \(p \in [l,r)\),则将 \([l,r]\) 拆分为 \([l,p]\) 和 \([p+1,r]\),直至所有区间都不存在 \(p\),此时的 \(m\) 即为答案。
对于这样的区间分裂过程,如果分裂长度 \(l=x+y\),我们可以在 \(O(\min\{x,y\})\) 的复杂度内解决,那么总复杂度就是启发式分裂的复杂度也就是 \(O(n \log n)\)。
考虑对于区间 \([l,r]\),如何快速维护其向下分裂的结果?
18 QOJ6406
有直接的 DP。\(f_S\) 表示访问 \(S\) 内所有点的最小初始血量。复杂度 \(O(n2^{n-1})\)。\(n \leq 26\) 时直接使用这个算法。
\(n>26\) 时,\(n+m \leq 72 \to m\leq 45\)。至多 \(m-(n-1)\) 个点入度大于 \(1\),枚举每个点的父亲,复杂度 \(O(2^{m-(n-1)})\),然后在叶向树上做经典的树上优先队列贪心维护连通块即可。
19 QOJ5173
不难发现问题等价于找到尽量多的区间 \([l_1,r_1],\cdots,[l_k,r_k] \subseteq [L,R]\) 使得 \(a_{l_i}=a_{r_i}\) 且 \(l_i < r_i \leq l_{i+1}\)。倍增即可。复杂度 \(O(n \log n)\)。
20 P8171
可以发现同颜色应该排在一起,按照长度构成一个单峰的结构。只需要求出 \(g_i\) 表示出现次数为 \(i\) 的颜色个数,之后不难贪心求出答案。
显然只有 \(O(\sqrt n)\) 个 \(g_i\) 非 \(0\)。考虑在莫队过程中求出所有有值的 \(g_i\)。如果直接记录一个 set 表示所有非 \(0\) 的位置,复杂度是 \(O(n \sqrt q \log n+q \sqrt n)\) 的,不够优秀,换成维护双向链表即可做到 \(O(n \sqrt q + q \sqrt n)\)。
21 QOJ17754
这个叫什么平面网格化吗,反正是一个套路,还有一个题叫做 沼泽里的青蛙。
若 \(\mathrm{dis}(i,j) < d\) 则 \(i,j\) 连边。图必须是二分图才有解。先考虑怎么把图建出来。
将平面按照 \(a = \dfrac{\sqrt 3}{3}d - \epsilon\) 为边长的正方形分块。任意一个块内任意两个点欧几里得距离最大值为 \(\sqrt 3 a < d\),所以一个块内最多两个点,否则无解。此外对于任意一个点,与其欧几里得距离小于 \(d\) 的点所在块一定在这个点所在块附近 \(O(1)\) 个,从而不难将图建出来。
然后每个连通块有选黑点白点两种选择,即求 \([x^k]\prod \limits_{i=1}^m \left(a_ix^{b_i}+c_ix^{d_i}\right)\)。不妨设 \(b_i \leq d_i\),即求 \([x^k]\left(Ax^{B}\prod \limits_{i = 1}^m \left(1+w_ix^{v_i}\right)\right)\),满足 \(\sum v_i = O(n)\),分治 NTT 即可。复杂度 \(O(n \log^2 n)\)。
22 P15066
根据经典套路我们知道对于固定的 \(r\),\(v_l = \gcd \limits_{i=l}^r a_i\) 只有本质不同的 \(O(\log V)\) 个值,按照 \(r\) 扫描线维护所有本质不同的 \(v_l\) 以及其最靠左的 \(l\)。我们知道答案选择的区间 \([l',r']\) 满足 \(l'=l\) 或者在 \(r'\) 时有 \(v_{l'-1} \neq v_{l'}\)。总共有 \(O(n \log V)\) 个有效区间,询问矩形 \(\max\),直接扫描线维护可以做到 \(O(n \log V \log n)\),可以通过。
注意到扫描线过程中本质要做 \(O(n \log V)\) 次前缀 chkmax,查询 \(O(n)\) 次后缀 \(\max\)。维护单调栈可以做到总复杂度 \(O(n \log V)\)。
23 LOJ511
设某个独立集为 \(J\)。我们先对于每个 \(i\) 求出 \([1,a_i-1]\) 中 \(J\) 与 \(I\) 状态完全一样,而 \(a_i \notin J\) 的 \(J\) 的数量。我们关心其是否大于 \(k\),如果小于等于 \(k\) 我们关心具体值。
注意到 \(m\) 个点的一棵树的独立集个数至少为 \(2^{\frac{m}{2}}\),黑白染色后取较大的那一侧的任意子集即可。所以当且仅当 \(m \leq 2\log_2 k\) 时我们才需要 DP 求方案数,所以这部分复杂度 \(O(n \log V)\)。
然后逐位确定答案就行。
24 P11095
这个题有点难。
直观的想法肯定是枚举最小值或者最大值,而枚举最小值比较困难,因为此时要求最小值必须取到枚举的,因为我们希望最小化答案。而枚举最大值则不然,我们只要求最大值小于等于枚举的值,否则求出的答案只会变劣。
所以我们考虑按边权从小到大枚举路径的边权最大值。假设现在枚举到值 \(x\),我们希望对于所有 \(k\),在只考虑边权小于等于 \(x\) 边的情况下,找到一条 \(1\) 到 \(k\) 的路径使得路径边权最小值最小,并用这个值加 \(x\) 更新答案。
进一步,我们考虑对于一张图如何求出 \(1\) 到 \(k\) 路径边权最小值的最小值。考虑边 \((u,v)\),显然存在 \(1\) 到 \(k\) 的经过边 \((u,v)\) 而不经过重复边的路径当且仅当缩边双后 \(1\) 到 \(k\) 的路径包含边 \((u,v)\)。所以我们考虑在扫描的过程中动态维护边双缩点结果。
将树视作 \(1\) 为根,每次添加边 \((u,v)\),分类讨论:
- \(u,v\) 属于同一个边双连通分量。显然这样的边不影响答案。
- \(u,v\) 不在同一个连通块内。加入这条边,合并两个连通块,并尝试更新答案。
- \(u,v\) 在同一个连通块内但不在同一个边双连通分量中。此时要将 \(u,v\) 这段路径上所有点合并成一个新的边双连通分量,并更新 \(u,v\) 的 LCA 子树内的所有点的答案。
用 LCT 维护肯定不方便,我们可以先离线将整棵树建出来,然后路径合并边双可以在树上做并查集维护,二类操作相当于子树 chkmin,但是有些点可能在操作时还没有和目前 \(1\) 所在连通块相连,所以维护线段树支持单点激活,以及对区间激活过的点 chkmin 即可。复杂度 \(O(n \log n)\)。
25 联考模拟赛 T1
直接做很困难。考虑将操作 \(2\) 改为选择某个 \(b_i\),将其分裂为 \(\lfloor \dfrac{b_i}{2} \rfloor\) 与 \(\lceil \dfrac{b_i}{2} \rceil\)。进行 \(n-m\) 次操作,最终每个 \(a_i\) 匹配一个 \(b_j\),要求 \(a_i \geq b_j\),也就是将 \(a,b\) 从小到大排序后有 \(a_i \geq b_i\)。
每次取出 \(a,b\) 中最大的数 \(m_a,m_b\)。如果 \(m_a \geq m_b\) 并且 \(b\) 现在大小至少为 \(2\) 或者 \(a,b\) 大小均为 \(1\),就删去 \(m_a,m_b\),否则将 \(m_b\) 进行分裂。复杂度 \(O(n \log n)\)。
26 联考模拟赛 T2
忽略叶子之间的边,对树三度化后,考虑边分治。每个询问在第一次被选取的边将询问两端点断开后不再将这个询问递归进去。这样每个询问被递归 \(O(\log n)\) 层。
边分治每次选一条边后,目前连通块断开为两部分。注意到横跨两部分的边只有 \(O(1)\) 条,因为叶子加的边是环。将所有这样的边的端点作为起点在连通块内跑最短路,并用 \(d_u+d_v\) 更新 \((u,v)\) 的答案。总复杂度 \(O(n \log^2 n + q\log n)\),可以通过。
27 联考模拟赛 T3
28 P16458
先做静态问题。
二选一,考虑 \(x_i\) 与 \(y_i\) 连边。每条边钦定方向,最大化入度为 \(0\) 的点的最小值加出度为 \(0\) 的点的最小值。
对每个连通块分类讨论是否为树,不难推出答案形式,动态问题线段树分治解决即可。
29 联考模拟赛 T1
有直接二分然后考虑前缀和将问题转化为差分约束的做法,复杂度过高。
对于区间 \([l,r]\),若存在另一个区间 \([L,R]\) 使得 \([L,R] \subseteq [l,r]\),则 \([l,r]\) 内至少有一个点的限制是没有用的。这启发我们只考虑所有不存在子区间的区间里填数。
首先可以发现一个显然的答案下界。对于任意区间 \([l,r]\),找到若干不交区间 \([L_1,R_1],[L_2,R_2],\cdots,[L_k,R_k]\) 满足 \([L_i,R_i] \subseteq [l,r]\),且 \(R_i < L_{i+1}\),那么答案至少为 \(k\),因为每个 \([L_i,R_i]\) 内部都一定有至少一个。设所有区间的 \(k\) 的最大值为 \(m\)。
接下来我们声称答案为 \(m\) 或 \(m+1\)。我们先给出一个构造说明答案不超过 \(m+1\)。取出所有不存在子区间的区间 \([l,r]\),每次取所有这样的区间中,区间内没有选任何数的区间的右端点最小值并选取之。容易说明答案不超过 \(m+1\)。
接下来只需要判定答案是否为 \(m\)。发现问题等价于在数轴上选若干位置 \(a_1,a_2,\cdots,a_k\),满足不存在区间 \([l_j,r_j] \subseteq (a_i,a_{i+1})\),同时不存在 \([a_i,a_{i+m-1}] \subseteq [l_j,r_j]\)。
从右到左考虑每个位置 \(i\),我们考虑判断这个位置能否被选,其下一个被选的位置通过包含于 \((i,+\infty)\) 内的区间的右端点最小值进行限制,我们显然选取小于等于这个位置的最靠右的好的位置。倍增处理 \(f_{i,j}\) 表示 \(i\) 之后 \(2^j\) 步会到哪个位置,跳 \(m\) 步后判定这个最远位置是否会被区间包含,从而确定 \(i\) 是否可以取。复杂度 \(O(n \log n)\)。
30 联考模拟赛 T2
这个结构是一棵无限二叉树,二叉树每个叶子写有一个 \([1,n] \cap \mathbb{Z}\) 的数 \(i\) 表示到了这个叶子输出 \(i\)。
令根深度为 \(0\),我们要求对于每个 \(i\),\(\sum \limits_{c_j = i} \dfrac{1}{2^{d_j}}=\dfrac{a_i}{\sum a}\),并最小化 \(\sum \limits_{j} \dfrac{d_j}{2^{d_j}}\),这里 \(j\) 都是叶子。
注意到两个深度为 \(d\) 的点对概率的贡献显然和一个深度为 \(d-1\) 的点一样,然而对期望次数的贡献分别为 \(\dfrac{d}{2^{d-1}}\) 和 \(\dfrac{d-1}{2^{d-1}}\),显然后者更优。所以我们希望能将每个 \(\dfrac{a_i}{\sum a}\) 在树上的深度对应到二进制表示。
我们先说明确实存在无穷二叉树使得每个 \(i\) 的叶子对应深度表示就是 \(\dfrac{a_i}{\sum a}\) 的二进制拆分。考虑一层一层向下,对于目前深度 \(i\),考虑所有 \(\dfrac{a_i}{\sum a}\) 的 \(\dfrac{1}{2^{i+1}}\) 位开始的二进制拆分的和,设其为 \(\dfrac{j}{2^i}\),显然 \(j \in \mathbb{Z}\)。我们要求目前有 \(j\) 个叶子继续向下拆分。设所有 \(\dfrac{a_i}{\sum a}\) 有 \(c\) 个二进制拆分有 \(\dfrac{1}{2^{i+1}}\),我们扩展到 \(2j\) 个叶子后将 \(c\) 个扔掉。此时新的 \(j'=2j-c\),恰好也等于我们剩下的向下扩展叶子个数。所以有解。
接下来只需要对于每个 \(i \in [0,\sum a)\) 计算 \(\dfrac{i}{\sum a}\) 在二进制拆分中 \(\sum \dfrac{d}{2^d}\) 的和,记其为 \(f_i\),\(\sum a = m\)。注意到有 \(f_i=\dfrac{f_{2i \bmod m}}{2}+\dfrac{i}{m}\),原因考虑 \(2i\) 和 \(i\) 二进制拆分表示即可。\(2i \bmod m \rightarrow i\) 连边,在外向基环树森林上考虑问题,在环上消元后直接做树上答案即可。复杂度 \(O(n+m)\)。
31 联考模拟赛 T3
有一万种乱搞。
将每条边上的集合随机打乱,按随机顺序加边,如果存在可以选的直接选上,否则假如边为 \((u,v)\),找一个颜色 \(c\) 使得 \(u\) 不存在这种颜色边,\(v\) 存在,将 \(v\) 这条颜色的边删掉换到 \((u,v)\) 这里继续增量。
32 P15130
\(q\) 次询问区间 \((i,h_i)\) 构成上凸包点数。
猫树分治,对于 \(mid\) 向两侧建凸包。询问需要合并前后缀凸包,相当于删去 \([L,mid]\) 一个后缀和 \((mid,R]\) 的一个前缀,这个东西可以倍增处理。复杂度 \(O((n+q)\log^2 n)\)。
33 CF283E
竞赛图的三元环个数等于 \(\dbinom{n}{3}-\sum \dbinom{d_i}{2}\),\(d_i\) 是点 \(i\) 的出度。
从前向后扫描线,只需要对于目前的 \(i\) 维护所有其他点和其之间的关系被翻转次数的奇偶性即可。线段树维护,复杂度 \(O(n\log n)\)。
34 P15133
对于每个 \(i\) 找到左右第一个比他小的,在平面上刻画对哪些 \((j,k)\) 造成影响。大概是一个平行四边形加,查询 \(x \in [l,r],y = c\) 的点权和状物。可以改成三角形加然后从下往上扫描线。
35 P15134
从高到低依次考虑每一二进制位。
记 \(A_0,A_1\) 为 \(a\) 中这一位为 \(0\) 的数,\(B_0,B_1\) 为 \(b\) 中的。
类似在 01-Trie 上求异或最小值,我们对 \(x\) 在这一二进制位的值分类讨论:
-
\(x\) 这一位为 \(0\)。可以发现 \(A_0\) 与 \(A_1\) 之间必定没有不等限制,递归进入 \((A_0,B_0)\) 与 \((A_1,B_1)\) 求解即可。
-
\(x\) 这一位为 \(1\)。对 \(B_0,B_1\) 分类讨论:
- \(B_0 \neq \varnothing\) 且 \(B_1 \neq \varnothing\)。不难说明 \(\forall x, y \in A_0, x \neq y:c_x \neq c_y\),同理有 \(\forall x,y \in A_1,x \neq y:c_x \neq c_y\)。此外对于任一 \(u \in A_0\),若存在 \(v \in B_1\) 使得 \(a_u \oplus b_v \leq x\),那么 \(c_u\) 与 \(A_1\) 中所有颜色也不同。同理 \(u \in A_1,v\in B_0\) 也有此结论。这样的数的颜色和所有其他数的颜色不同,将他们依次染色为 \(1,2,\cdots\),注意到其他数对之间没有任何限制,只有 \(A_0,A_1\) 内部限制,所以可以直接计算答案。
- \(B_0 = \varnothing\) 或 \(B_1 = \varnothing\)。不妨设 \(B_1 = \varnothing\) 且 \(B_0 \neq \varnothing\)。此时 \(A_0\) 中颜色互不相同,递归进入 \((A_1,B_0)\),然后 \(A_1\) 中每个数要么和 \(A_0\) 之间没有任何限制,要么和 \(A_0\) 所有数有限制。这也是容易处理的。
总复杂度 \(O(n \log V)\)。
36 QOJ6415
我们猜测答案为 \(0\) 充要条件是分别只考虑 \(x,y\) 意义下不存在绝对众数。证明只需先将问题变为只考虑 \(x\) 或 \(y\) 时,存在出现次数恰为一半,然后贪心构造即可。
对于原问题,可以发现不可能考虑 \(x,y\) 时均存在绝对众数,以 \(x\) 出现绝对众数为例,每次消掉绝对众数上的两个直至 \(x\) 上不存在绝对众数显然是答案的下界。可以说明下界可以取到,也就是有方法配对删去使得 \(y\) 上没有绝对众数。做法是将这个 \(x\) 上所有点按照其 \(y\) 上其他数的个数大到小排序,相邻删去。不难说明正确性。
复杂度 \(O(n)\) 或 \(O(n \log n)\),依赖于具体实现。
37 QOJ6454
这个题牛完了。
首先 \(v_i<0\) 可以将 \(v_i\) 与 \(i\) 处的括号同时取反。现在问题转化为 \(v_i \geq 0\)。
判掉 \(2 \nmid n\)。先考虑对于长度为偶数 \(n\) 的字符串 \(s\),至少需要修改几个位置可以使其成为一个合法括号串。有结论是,将左括号看作 \(+1\),右括号看作 \(-1\),最小前缀和为 \(w\),总和为 \(s\),那么最少修改次数即为 \(2\lceil \dfrac{-w}{2} \rceil+\dfrac{s}{2}\)。所以要求 \(2\lceil \dfrac{-w}{2} \rceil + \dfrac{s}{2} > k\)。
注意到若将一个更大的前缀和 \(w'\) 带入式子成立,则 \(w\) 也成立。所以枚举一个 \(i\),钦定 \([1,i]\) 是前缀和最小值,计算使得式子成立的最小花费。
设 \([1,i]\) 中最后有 \(p\) 个右括号,\([i+1,n]\) 最后有 \(q\) 个左括号。写出来发现限制是 \(p+q\) 大于等于某值,所以只有前面的左括号改右括号,和后面的右括号改左括号,取花费前若干小的即可。按 \(i\) 从小往大扫,复杂度 \(O(n \log n)\) 或 \(O(nv)\)。
38 联考模拟赛 T1
P13011。在题解区写了。
39 联考模拟赛 T2
显然是一个状压 DP 结构。考虑如何进行 \(f_S \rightarrow f_{S \cup \{i\}}\) 的转移。
对于第 \(i\) 组的所有位置 \(s_1,s_2,\cdots,s_k\),从左侧来的占据了一段前缀,从右侧来的占据一段后缀。枚举前缀长度 \(l\),贡献是长度为 \(l\) 的排列和 \(n-l\) 的排列的期望逆序对个数和,加上 \(S\) 内的数对前后缀的贡献。
不难证明总贡献关于 \(l\) 下凸,三分即可。
40 联考模拟赛 T3
41 QOJ6508
如果限制每个点匹配至多两个点,那么得到若干环或链。显然每个长度至少为 \(2\) 的环或链都能表示为长度为 \(2\) 或 \(3\) 的链并,所以孤点尽量少等价于尽量多的点有向外匹配的边。将每个点拆成两个点,分别连 \((1,-\infty)\) 和 \((1,0)\) 的边跑最小费用任意流即可。
在此基础上最小化长度为 \(3\) 的链数量。将 \((1,0)\) 改为 \((1,1)\) 即可。
直接跑费用流过不去。注意到任意增广路费用均为 \(-2 \times \infty\) 或 \(-\infty + 1\),且没有零环,只跑两次最短路然后保留最短路上的边跑最大流即可,复杂度 \(O(m \sqrt n)\)。
42 联考模拟赛 T1
42 联考模拟赛 T2
问题可以对偶成,选 \(\lfloor \dfrac{n-1}{2} \rfloor\) 个数系数为 \(+1\),再选 \(\lfloor \dfrac{n-1}{2} \rfloor\) 个数系数为 \(-1\),最大化所有数乘以系数的和。
先考虑 \(n\) 是奇数,此时 \(2 \mid n-1\)。\(+1\) 和 \(-1\) 都恰好选一半。将每条边拆成两条,颜色分别为黑和白,权值分别为 \(w\) 和 \(-w\),则问题变为选一棵恰有 \(\dfrac{n-1}{2}\) 条黑边的权值和最大的生成树。这是 P2619,wqs 二分即可。
\(n\) 是偶数时,有一条边系数为 \(0\),注意到和上述做法基本等价,只不过要求的不是生成树而是生成树断掉一条边。做法是一样的。
wqs 二分内部对边排序可以归并,复杂度 \(O(n \log V)\)。
43 联考模拟赛 T3
先想分治结构。可以对行建线段树,变成 \(l=1,r=n\) 的总规模 \(O(n \log n)\) 的原问题。
行上区间覆盖变成颜色段均摊,然后对列建线段树每个点维护一个 set 可以做到总复杂度 \(O(n \log^3 n)\),无法通过。瓶颈在于有撤销操作所以必须要使用 set。
换个角度,直接对列建线段树,每个查询挂到线段树节点上。而修改操作通过颜色段均摊变为 \(O(q)\) 个 \([x,l_y,r_y,l_t,r_t]\) 的包含时间的信息。按照时间从小到大做,考虑查询区间与覆盖区间在线段树上有贡献的形态,必然是有祖先关系。要么覆盖区间是查询区间的祖先,要么反过来。若是前者,注意到这样的覆盖区间对于一次查询只有 \(O(\log m)\) 个,直接对每个线段树节点在行上建线段树维护区间 \(\max\)。后者在进行覆盖操作时遍历其所有祖先。总复杂度 \(O((n+q)\log^2 n)\)。
46 QOJ6432
这不是我们 starmap 吗。
显然先转化为从边权全 \(0\) 的图开始进行操作,合法必要条件是所有边权值和为 \(0\)。
注意到操作 \((a,b,c,d,x)\) 和 \((b,a,c,d,x)\) 会恰好使得 \((a,b)\) 加 \(2x\),\((c,d)\) 减 \(2x\)。所以只要所有边权都是偶数就可以操作。
怎么把所有边权变为偶数?注意到选 \(x=1\) 操作会将一个 \(K_4\) 内所有边奇偶性取反,也就是 starmap 的 \(k=4\) 情况。根据 starmap 我们知道可以取反一个四元环,具体来说要取反 \((a,b,c,d)\) 构成的四元环只需要选取 \(e,f\),进行操作 \((a,b,e,f),(b,c,e,f),(c,d,e,f),(d,a,e,f)\) 即可。
\(n \geq 6\) 时必定有解,先归纳到 \(n=6\) 然后 \(2^{\binom{n}{2}}\) 搜一下即可。归纳方法是取出 \(n\) 号点所有边权奇数的邻边,如果有偶数个根据消去四元环的方法两两匹配,否则选另外两个边权偶数的邻边和剩下的边权为奇数的一条邻边操作就可以变为偶数条。
\(n=5\) 时也需要将所有边变为偶数,同理 \(2^{\binom{n}{2}}\) 搜索。
\(n=4\) 时解一个四元方程组,未知数是在每个点上的操作次数。
操作次数限制是很松的,朴素实现即可。
47 QOJ6521
记 \(s(l,r)=\operatorname{AND} \limits_{i=l}^r a_i\)。定义前缀关键点集合 \(S = \{i \mid s(1,i-1) \neq s(1,i)\}\),后缀关键点集合 \(T=\{i\mid s(i,n) \neq s(i+1,n)\}\)。
假设答案交换 \(a_x,a_y\),其中 \(x<y\),不难注意到一定有 \(x \in S \cup T\) 或 \(y \in S \cup T\)。
若 \(x,y \in S \cup T\),直接枚举所有 \(x,y\) 对 \(O(n\log^2 V)\) 计算答案。
接下来考虑 \(x,y\) 只有一个 \(\in S \cup T\),不妨假设是 \(x \in S \cup T\) 而 \(y \notin S \cup T\),这样的 \((x,y)\) 只有 \(O(n \log V)\) 对,但难以对每一对简单计算答案。考虑确定 \(x,y\) 后选取前缀为 \([1,k]\),其中 \(k \in [x,y)\),那么答案即为 \(\left(s(1,x-1) \operatorname{AND} s(x+1,k) \operatorname{AND} a_y\right) + \left(s(k+1,n) \operatorname{AND} a_x\right)\),前面容易理解,后面的式子原因是 \(y \notin S \cup T\),所以删去 \(a_y\) 不会使后缀答案改变。
显然确定 \(x\) 后这样的 \(k\) 只有 \(O(\log V)\) 是有用的,然后枚举其后的 \(y\) 即可。
总复杂度 \(O(n \log^2 V)\)。
48 QOJ7415
折半警报器板子。注意到 \(a+b\geq s\) 的必要条件是 \(a \geq \lceil \dfrac{s}{2} \rceil\) 或 \(b \geq \lceil \dfrac{s}{2} \rceil\),所以对于每个 \((a,b,s)\) 在 \(a,b\) 处打一个 \(\lceil \dfrac{s}{2} \rceil\) 的警报,实时维护所有激活的 \(i\),合并时启发式合并。复杂度 \(O(n \log n \log V)\)。
49 QOJ7605
直接 DP 是 \(O(n^2)\) 的。
区间 \(\mathrm{MEX}\) 不容易维护,最常用的方式是按 \(i\) 扫描线维护所有 \([j,i]\) 的区间 \(\mathrm{MEX}\) 关于 \(j\) 构成的连续段。这和 DP 的方向是一样的。\(i \rightarrow i+1\) 时,考虑 \(a_{i+1}\) 在之前的哪个连续段作为区间 \(\mathrm{MEX}\) 出现,然后将这段分裂。注意到复杂度和分裂次数有关,而总连续段数是 \(O(n)\) 的,所以这么做复杂度是线性的,分裂时要维护线段树二分,复杂度 \(O(n \log n)\)。
对于原问题的 DP,式子形如 \(f_{i} = \max \limits_{j \in [i-k+1,i]} \{f_{j-1}+(s_i-s_{j-1})m_{j,i}\}\),注意到一个 \(\mathrm{MEX}\) 连续段的 \(m_{j,i}\) 相同,所以对于一个完整的连续段我们只需要其中 \(f_{j-1}-s_{j-1}m\) 最大的一个,这对于 \(i\) 无关,在分裂合并 \(\mathrm{MEX}\) 连续段过程里,使用线段树套李超树维护。求出这个最大之后,对 \(i\) 的贡献形式也是一次函数 \(s_im+b\),另维护一棵线段树套李超树,对于连续段 \([l,r]\) 将这个函数挂在 \(l\) 上即可。查询时至多只有一个连续段没有被完整贡献而是选择一端后缀,这可以通过在第一棵树套树上查询实现。
虽然李超树不支持删除直线,但是操作过程中 \(j \rightarrow i\) 的贡献一定不大于 \(j \rightarrow i+1\) 的贡献,所以直接插入新的直线而忽略曾经直线作为最优值的可能即可。复杂度 \(O(n\log^2 n)\)。
50 QOJ6520
根据 Kruskal,先把边权为 \(0\) 和 \(1\) 的合并,然后图只剩 \(O(m)\) 个点,Boruvka 做一下就行。
51 QOJ8035
正解是两个 \(\log\) 的,但高妙的根号做法也可以过。
首先有丑陋的根号做法是直接 K-D Tree。
这个结构比较像折半警报器状物,考虑如果所有 \(k_i \leq \sqrt{n}\),将每个区间挂在线段树上维护,线段树每个节点维护链表,加入单点时遍历对应叶子的所有祖先并遍历链表中的所有警报。复杂度 \(O(n \sqrt n)\)。
对于原问题,每加入 \(O(\sqrt n)\) 个数重构一次即可。每个区间会被加入一次并被遍历 \(O(\sqrt n)\) 次。总复杂度 \(O(n \sqrt n)\),可以轻松通过。
52 P10004
先做二维容斥,变成求 \(g_{x,y}\) 表示排列与其逆分别钦定了 \(x,y\) 个相邻上升位置的方案数。原答案 \(f_{x,y}\) 根据二维容斥为 \(f_{x,y} = \sum \limits_{a \geq x, b \geq y} (-1)^{a-x+b-y} \dbinom{a}{x}\dbinom{b}{y} g_{a,b}\)。直接按式子求和是 \(O(n^4)\) 的,两维分别增量就是 \(O(n^3)\) 的。
现在考虑怎么求 \(g_{x,y}\)。类似一维问题即欧拉数问题,钦定 \(x\) 个相邻上升等价于钦定 \(n-x\) 个上升连续段。所以问题等价于钦定 \(X=n-x\) 个上升连续段和 \(Y=n-y\) 个逆排列上的上升连续段。
考虑记 \(c_{i,j}\) 表示排列的第 \(i\) 个上升连续段内的所有数对应在逆排列上第 \(j\) 个连续段内有几个数。其中 \(1 \leq i \leq X\) 以及 \(1 \leq j \leq Y\),我们发现每一种排列和钦定的正反连续段都对应到上述 \(X \times Y\) 矩阵 \(c\),而一个非负整数矩阵 \(c\) 能对应到恰好一个原排列和连续段钦定当且仅当:
- \(\sum \limits_{i,j} c_{i,j} = n\)。
- \(\forall i \in [1, X]: \sum \limits_{j=1}^Y c_{i,j}>0\)。
- \(\forall j \in [1,Y]: \sum \limits_{i=1}^X c_{i,j} > 0\)。
显然均是必要条件。充分的原因考虑首先可以根据每行每列的和确定连续段划分情况,然后依次确定 \(p_1,p_2,\cdots,p_n\),每个原排列上升连续段内的 \(p\) 依次确定为对到逆排列后从前往后的位置,显然这是唯一可行的地方。
现在只需计数 \(c\) 的方案数。仍然是二维容斥,钦定 \(a\) 行 \(b\) 列为空然后插板即可。总复杂度 \(O(n^3)\)。
53 QOJ9241
比较简单的题。
先考虑 \(50\) 分怎么做,要求一个染色使得每条边端点颜色是否相同的状态和原染色状态一致。
我们令颜色 \(\infty\) 表示颜色 \(n\)。
询问带给我们的信息极其有限,大体思路应该是归纳,询问过程中我们用并查集动态维护所有同色连通块。\(n \rightarrow n+1\) 时,加入点 \(n+1\),尝试还原 \(n+1\) 的颜色。将 \(n+1\) 和其所有邻居取出,将 \(n+1\) 和所有邻居都染为原色,其余点染为 \(+\infty\)。可以发现 \(n+1\) 和所有邻居颜色不同,以及存在某个邻居与其相同的两种状态,对应的询问结果必定不同。更具体地,如果我们对于每个同色连通块只保留其至多一个邻居,那么通过询问我们还可以确定新的点 \(n+1\) 和前面哪些邻居的颜色相同,然后依次二分。注意到每次二分我们都会合并一条边,设总共有 \(c\) 个极大同色连通块,询问次数不超过 \((n-c) \lceil \log_2 n \rceil+n\)。至此 \(50\) 分已经解决。
现在考虑怎么还原每个点真实颜色。首先如果只需要查询一个点的颜色,随便找一个邻居,然后枚举 \(0\) 到 \(n-1\) 所有可能颜色并判定,将其他点设为颜色 \(\infty\) 进行询问即可。询问次数不超过 \(n\)。
对于求出的每个极大同色连通块显然只需要求出其中任意一个点的颜色,称这样的点为关键点,总共 \(c\) 个。如果 \(c\) 个点两两不相邻,考虑每个点取出一个邻居,这些邻居可以有相同的。然后遍历 \(1\) 到 \(n\),尝试确定哪些关键点颜色为 \(i\)。和归纳里面的过程类似,通过将关键点选的邻居都改为颜色 \(i\) 可以确定是否有点颜色为 \(i\),然后从前往后二分直至不存在。这样的询问次数不超过 \(c \lceil \log_2 n \rceil+n\)。
如果 \(c\) 个点并非两两不相邻,对 DFS 树黑白染色分别取出黑关键点和白关键点做一次即可。
容易发现总次数不超过 \(n \lceil \log_2 n \rceil+3n\),可以通过,实际上可以分析到更低为 \(\sum \limits_{i=1}^{n} \lceil \log_2 i \rceil+3n\),这是因为二分之后会删掉答案。
54 P9000
二分答案 \(x\),从前往后肯定是能取的越左越好,离线后线段树维护广义矩阵乘法,复杂度 \(O(n \log n)\)。
55 QOJ10104
考虑将方案双射到集合 \(S \subseteq 2^{[s+1]\times [n]\times [m]}\),\((i,j,k) \in S\) 当且仅当 \(i\) 时刻开始时,格子 \((j,k)\) 有雨滴。对于 \(S\),存在原方案当且仅当 \(\forall i \leq S, j < n, k+d_i \leq m\),若 \((i,j,k) \in S\),则 \((i+1,j+1,k+d_i) \in S\)。容易说明只需计算符合条件的集合 \(S\) 个数。
连边 \((i,j,k) \rightarrow (i+1,j+1,k+d_i)\),图构成若干有向链,每段链属于 \(S\) 的是一段可空后缀。若一条链点数为 \(i\),则贡献 \((i+1)\),答案是贡献乘积。直接做是 \(O(snm)\)。
我们希望求出每种长度的链的个数。考虑到 \((i,x,y)\) 往下链长度是 \(x,y\) 能扩展的次数较小值,并且只有 \(y\) 的扩展次数与 \(i\) 有关。考虑按 \(i\) 从后往前扫描线,对于每个 \(y\) 维护 \((i,y)\) 的扩展次数 \(g_y\)。\(i \rightarrow i-1\) 时,形如将 \(g\) 序列前面删去 \(d\) 个数并在末尾补 \(d\) 个 \(1\),或者末尾删去 \(d\) 个数前面补 \(1\)。用双端队列维护同色连续段即可。计算贡献只在每个段被弹出时计算,这个计算贡献是不难的。
总复杂度 \(O(s(\log s+\log n+\log m))\),瓶颈在于快速幂。
56 QOJ11410
首先进行观察。当已知一个点的状态时,在询问串中同时翻转他和他的两个儿子,等价于切换这个点的运算符,或变为与,与变为或。
先考虑关于点数线性次询问。按照 DFS 序依次考虑每个点,判定其是否为 OR,在判定其前,其所有祖先都已确定状态。将这个点的两个儿子子树内叶子一个全染 \(0\) 另一个全染 \(1\),其余叶子都染为 \(0\),然后将这个点的父亲到根的链都改为 OR 运算,即可判定这个点是 AND 还是 OR,从而做到点数次询问。
进一步,我们希望给出集合 \(S\),能判定集合 \(S\) 内是否存在 OR。然后在 \(n\) 个位置中找至多 \(r\) 个 \(1\) 的方法是在顶层进行分块并在内层二分,可以做到和信息熵分析所得下界 \(\lceil \log_2 \dbinom{n}{r}\rceil\) 同阶的询问次数。也就是设块长 \(B\),每个块询问一次,如果块内有 \(1\) 再去块内二分,询问次数 \(\lceil \dfrac{n}{B}\rceil+r (\lceil \log_2 B\rceil +1)\)。取 \(B=32\) 可以在这个题中最小化次数。
现在尝试解决给定集合 \(S\) 判定其内是否存在 OR。然而并不方便,事实上如果 \(S\) 给出的是若干条不交祖先后代链且不存在一条链的某一端点是另一条链的某一端点的祖先,且这些链的较浅端点以上的点都已确定状态,那么可以判定 \(S\) 内是否有 OR。方法是让每条祖先后代链的除底端每个点的非链儿子方向为 \(1\),底端的点的两个儿子子树分别是 \(0\) 和 \(1\),不处于链内的,在某些链上面的点的值为儿子的或,容易发现任意一条链内任意一个点为 OR 就会使得最终值为 \(1\)。
现在尝试将点集表示为若干符合上述条件的路径集合的并,若表示为 \(c\) 个则需要额外 \(c\) 次询问。对树轻重链剖分,令每条重链的权值为到跟的轻边数量。每种权值的链构成一个集合,显然其符合要求。总次数不超过 \(\lceil \dfrac{n}{B}\rceil+r (\lceil \log_2 B\rceil +1) +\lceil \log_2 n \rceil\),可以通过。
57 QOJ10669
注意到相邻三个数 \(a,b,c\) 若满足 \(a \leq b\) 且 \(b \geq c\),则任意一个人取走 \(a\) 或 \(c\),对方一定取走 \(b\),然后必然取走 \(a\) 或 \(c\) 没选的那个。总而可以将 \(a,b,c\) 变为 \(a+c-b\)。
不断操作会得到一个单谷序列,最优策略显然是每次取两端最大的。扩展到多个双端队列就是每次取所有队列两端最大的。序列左右两侧只能从一侧取,把他们拉出来中间补个 \(-\infty\) 就变成等价的问题了。复杂度 \(O(n \log n)\)。
58 P12508
先考虑暴力。显然是 \(i\) 从 \(1\) 出发跳 \(k-1\) 步经过 \(k\) 个点,记 \(r_i\) 为最小的 \(j\) 使得 \(a_j > a_i\) 且 \(j>i\),包括 \(i\) 在内还要 \(c\) 个区间,那么 \(i\) 的下一个点即为 \(j \in [i+1,\min(n-c+2,r_i)]\) 中 \(a_j\) 最小的 \(j\)。\(c=2\) 时有特殊情况。直接模拟,复杂度 \(O(nq)\)。
显然 \(k\) 对每个点的后继进行一个范围限制。考虑按 \(k\) 大到小扫描线,\(k \rightarrow k-1\) 时,会使若干点的限制变松,从而改变后继。我们找到最靠前的后继改变了的点 \(i\),由于 \(k\) 的减小导致这个点后继改变,容易发现这个点后继到 \(n\) 这段后缀内每个点都会被选。
维护两棵线段树,分别维护所有被选的点方便查询,以及所有被选的点还需要 \(k\) 减小多少才能改变后继。复杂度 \(O((n+q) \log n)\)。
59 QOJ14805
不妨考虑计算 \(c \geq w\) 的答案,贡献为 \(3w-c\)。\(c < w\) 只需将每个点颜色取反再做一次即可。
考虑在 LCA 处统计答案,限制相当于两条链的 \(c-w\) 之和非负,最大化 \(3w-c\)。注意到一棵子树的 \(c-w\) 是子树深度级别的,长链剖分维护,每个点枚举短儿子内所有不同 \(c-w\) 的值 \(x=c-w\),要求另一条链 \(c-w\geq -x\)。直接维护数据结构可以做到 \(O(n \log n)\),足以通过。更巧妙的方法是对每个点所有 \(x \geq 0\) 维护 \(x\) 开始的后缀最大值,查询时要么直接查询,要么查询 \(x=0\) 处的后缀最大值和若干负数的权值最大值,而负数的范围是短儿子深度的。更新也只需更新短儿子深度个最大的。复杂度 \(O(n)\)。
60 QOJ1142
考虑部分分,即不存在一个方格,其边角四个点都存在于集合内,也就是不存在 \(2 \times 2\) 矩形。对所有方格黑白染色,钦定黑方格只和横边连接,白方格只和竖边连接。容易发现每个方格至多和一条周围的边相连,所以有解当且仅当原图连通,直接据此构造即可。
存在 \(2 \times 2\) 矩形时,我们希望类似部分分进行处理。我们声称结论依然是有解当且仅当原图连通。对于每个 \(2 \times 2\) 矩形,若其为黑格,删去下面横边,若其为白格,删去右侧竖边。不难证明新图连通等价于原图连通,思路是只需证明每个 \(2 \times 2\) 矩形连通性不变。在新图上,每个方格至多只和一条周围的边相连。
复杂度 \(O(n \log n)\)。
61 OQJ1653
显然若有解会直接令 \(g=9\)。令矩阵大小为 \(k\)。
考虑写为集合形式,任意一个串的任意一个前缀对应一个集合 \(X\)。询问相当于给定集合 \(A,B\),问是否存在一个 \(X\) 满足 \(A \subseteq X \subseteq B\),若有还需找出。
我们只需解决判定问题,然后诸位确定以额外 \(O(k)\) 的复杂度求出解。
注意到 \(\min\{|A|,|B\setminus A|,|U\setminus B|\} \leq \lfloor \dfrac{25}{3} \rfloor = 8\)。所以只需要能分别提出复杂度只和 \(|A|,|B \setminus A|,|U \setminus B|\) 相关的算法即可。
显然直接枚举所有 \(A \subseteq X \subseteq B\) 的 \(X\) 即为 \(O(2^{|B\setminus A|})\) 复杂度。考虑 \(|A|\) 和 \(|U \setminus B|\) 的复杂度怎么做。
以 \(|A|\) 为例,\(|U \setminus B|\) 类似。限制是 \(A \subseteq X \subseteq B\),对 \(A \subseteq X\) 的限制容斥,钦定集合 \(S \subseteq A\) 满足 \(S \cap A = \varnothing\),限制为 \(A \subseteq (B \setminus S)\),乘以容斥系数 \((-1)^{|S|}\)。需要预处理高维前缀和。\(|U \setminus B|\) 则是高维后缀和。
总复杂度 \(O(k2^k+qk2^{\frac{k}{3}})\)。
62 QOJ1838
好题。
图论建模,两个矩形有交则连边,求 anti-\(K_3\) 数量。
容斥,则只需要计算每个点的度数以及图中的三角形个数。
先考虑计算度数。等价于对于每个矩形计算和其相离的矩形个数。可以容斥成计算若干矩形内子矩形个数,扫描线解决。复杂度 \(O(n \log n)\)。
难点是计算三角形个数。
容易发现若三个矩形两两交非空,则三个矩形交亦非空,且交为一个矩形。一个想法是对于每个方格计算 \(c_i\) 表示包含这个方格的矩形个数,则 \(\dbinom{c_i}{3}\) 是其对答案的贡献,通过容斥使得每个三角形贡献恰为 \(1\)。
我们希望有一个容斥方法,使得对于交非空的矩形三元组,贡献为 \(1\),交为空的三元组贡献 \(0\) 次。注意到在二维前缀和里做的那个东西,对于 \(n \times m\) 的矩形,我们总体计算一遍系数为 \(+1\),\((n-1)\times m\) 计算一次贡献为 \(-1\),\(n\times (m-1)\) 计算一次贡献为 \(-1\),\((n-1)\times (m-1)\) 计算一次贡献为 \(+1\) 即可。具体来说就是将每个矩形上边界,右边界,上右边界分别往内移一格并解决原问题,即求 \(\sum \dbinom{c_i}{3}\)。扫描线,那么只需要支持区间加,全局查询 \(\sum \dbinom{c_i}{3}\)。根据范德蒙德卷积,只需要维护区间 \(\dbinom{c_i}{0},\dbinom{c_i}{1},\dbinom{c_i}{2},\dbinom{c_i}{3}\) 即可。总复杂度 \(O(n \log n)\)。
63 QOJ2373
注意到对于集合 \(S\) 做询问 \(2\),所得结果的最大值即为 \(S\) 中的极差。
先询问一次 \([n]\),得到的最大值即为全局极差。然后二分一个极大前缀满足前缀极差等于全局极差,那么前缀的最后一个位置 \(p\) 即为全局最大值或最小值。此时所有 \(i \neq p\) 的 \(|a_i-a_p|\) 两两不同,只需要求出 \(b_i = |a_i-a_p|\) 然后问两次询问 \(1\) 即可求出所有 \(a\)。
考虑如何求出 \(b_i=|a_i-p_i|\)。令 \(q(S)\) 为对 \(S\) 进行询问二所得可重集,注意到若 \(p \notin S\),有 \(q(S \cup \{p\}) \setminus q(S) = \{b_i \mid i \in S\}\)。分治,对于目前集合 \(S\),已知 \(\{b_i \mid i \in S\} = T\),对于每个 \(i \in S\) 求出 \(b_i\)。令左右侧集合 \(L_S,R_S\),询问 \(q(L_S\cup \{p\}) \setminus q(S)\) 即得 \(T_L\),而 \(T_R=T \setminus T_L\)。
注意到分治过程中同层的询问可以一起做,所以总询问次数 \(3 \log_2n + O(1)\),可以通过。
64 QOJ4424
先考虑 \(c=0\),答案显然有下界 \(\dfrac{\sum \limits_{i=1}^n |a_i-p_i|}{2}\)。我们声称可以取到。
考虑连边 \(a_i \rightarrow p_i\),问题等价于有一个置换,每次选择两个点 \(i,j\) 交换 \(i,j\) 的出边,花费 \(|i-j|\),问变成 \(n\) 个自环的最小花费。
假设初始有 \(x\) 个置换环。\(c \neq 0\) 时,答案应该为 \(\dfrac{\sum \limits_{i=1}^n |a_i-p_i|}{2} + c(n-x)\)。考虑归纳证明。显然要求每次操作交换的两个点同处一个环上,才能使操作次数为 \(n-x\)。对于一个环,交换 \(i,j\),记 \(i\) 的出边为 \(x_i\),则要求 \(i \in [\min\{j,x_j\},\max\{j,x_j\}]\) 以及 \(j \in [\min\{i,x_i\},\max\{i,x_i\}]\) 才能分裂成两个环且答案不变。注意到取 \(x_i\) 最大的 \(i\) 容易说明存在可行的 \(j\)。直接做是 \(O(n^2)\) 的,考虑启发式分裂,每个环用 set 维护 \(\{i\}\) 的最大值,找到 \(i\) 后向前向后同时找可行的 \(j\),复杂度是分裂后较小的环长长度的,所以总复杂度 \(O(n \log^2 n)\)。
65 P16967
缩边双,每个边双要么对应原基环树非环上的一个点,要么对应整个环。若是前者,这个边双即为一个环,若为后者,则为若干环拼接。前者容易判断。对于后者,求出每个点在这个导出子图中的度数 \(d_i\),将所有满足 \(d_i \geq 3\) 且 \(d_j \geq 3\) 的边 \((i,j)\) 删去得到的每个环就是原图环上的一个点。复杂度线性。
66 P16958
要求字典序顺序,考虑枚举 \(s\) 和 \(t\) 第一个不同的位置 \(i\),\(t_i\) 为右括号,\(s_i\) 为左括号。为了判定合法括号序列,将左括号看作 \(1\),右括号看作 \(-1\)。要求所有前缀和非负且总和为 \(0\)。记 \(c\geq 0\) 为 \(s\) 的前 \(i\) 个位置权值和,则相当于平面坐标系中从 \((0,0)\) 走到 \((x,x+c)\),不触碰 \(y=x+c+1\) 的,每步向上或向右的格路计数,要求 \(i+2x+c \leq n\)。根据反射容斥可知方案数为 \(\dbinom{2x+c}{x}-\dbinom{2x+c}{x+c+1}=\dbinom{2x+c}{x}-\dbinom{2x+c}{x-1}\)。令 \(m=\dfrac{n-i-c}{2}\)。那么总贡献即为 \(\sum \limits_{x=0}^{m} \dbinom{2x+c}{x}-\dbinom{2x+c}{x-1}\)。对每个 \(i\) 计算之,复杂度 \(O(n^2)\)。
考虑优化,本质上我们要求若干个 \(f(n,c)=\sum \limits_{x=0}^n \dbinom{2x+c}{x}-\dbinom{2x+c}{x-1}\)。可以发现要求的相邻的 \(|n_2-n_1|+|c_2-c_1|\) 的总和是线性的,考虑是否存在递推关系可以进行 \((n,c)\rightarrow (n \pm 1, c)\) 以及 \((n,c) \rightarrow (n, c \pm 1)\) 的转移。前者是显然的,相当于式子加上或减去 \(O(1)\) 项。考虑后者即 \(c\) 的转移。
注意到有递推式 \(f(n,c)=f(n,c-1)+f(n-1,c+1)\),从而有 \(f(n,c)=f(n,c-1)+f(n,c+1)+\Delta\)。三者知二推一,即构建出了 \(f(n,c-1),f(n,c),f(n,c+1)\) 的 \(O(1)\) 可递推关系。只需要维护 \(n,c\) 对应的 \(f(n,c),f(n,c+1)\) 就可以做所有转移。
总复杂度 \(O(n)\)。
67 P16957
维护每个点为根时的答案。先考虑修改怎么做。显然交换相邻两项只会导致这两项顺序取反而其他二元组顺序不变,对于两个点 \(i,j\),考虑所有根 \(r\) 的贡献增量,可以写为 \(O(1)\) 个 DFN 区间加的形式。从而维护线段树区间加全局最小值即可做到 \(O(q \log n)\) 修改。
然后考虑怎么对于原序列求出每个点 \(r\) 的答案。从前往后考虑每个 \(p_i\),将 \(p_i\) 删去后,每个连通块内的 \(r\) 的增量相同,枚举 \(p_i\) 的所有子树以及父亲方向的子树,贡献是满足 \(j<i\) 且 \(p_j\) 不在这侧子树的 \(j\) 的个数,树状数组维护单点加区间查询即可。
总复杂度 \(O((n+q)\log n)\)。
68 QOJ4563
设 \(l_i,r_i\) 分别表示左右第一个大于等于 \(a_i+D\) 的位置,不存在设为 \(0\) 和 \(n+1\)。
显然两两可行当且仅当相邻两个可行,而相邻两个位置 \(i<j\) 可行当且仅当 \((l_i,r_i) \cap (l_j,r_j) = \varnothing\)。
注意到 \((l_i,r_i)\) 两两之间的关系要么不交要么包含,只需要计算极小区间个数。
对于每个极小区间在最小值所在位置统计答案。\(i\) 被统计当且仅当 \(a_i\) 为 \([l_i+1,r_i-1]\) 的区间最小值。
每个 \(i\) 计入贡献的是 \(D\) 的一段后缀,容易维护,查询时主席树即可。可能存在至多两个位置,一个在左侧一个在右侧,使得其原本没有贡献而截取区间后,\((l_i,r_i)\) 变小从而有贡献。这样的位置只可能是前缀或后缀最小值内的,满足其区间会因截断变小的位置中最靠后的那个。对单调栈建树在树上倍增即可找出。复杂度 \(O((n+q)\log n)\)。
69 QOJ4565
从前往后依次加入并询问一次,如果结果大于等于 \(2\) 就移出,可以求出序列的颜色数 \(c\)。答案在区间 \([1,\lfloor \dfrac{n}{c}\rfloor]\) 内。
二分答案 \(x\),考虑怎么判定出现次数的最小值是否大于等于 \(x\)。依次加入所有数并询问,如果新加数后询问结果为 \(x+1\),将这个数删去,否则保留。只需要判断最终保留的数的个数是否为 \(xc\)。至此可以做到 \(O(n \log n)\) 次询问。
注意到上述二分中,保留的数相当于每种数只保留前 \(x\) 个,而删去的数相当于每种数第 \(x+1\) 个开始的所有。在二分过程中,对于目前答案区间 \([l,r]\),每种数保留至多 \(r-l\) 个,这样二分时询问次数是不超过 \(c(r-l)\) 的,而递归进去会使得 \(r-l\) 减半,所以总次数是 \(T(n)=T(\dfrac{n}{2})+n\),所以总次数大概是 \(3n\) 的,然而递归进入不能直接除以 \(2\) 而是可能要向上取整,所以实际次数略比 \(3n\) 大。我们的策略是询问到 \(xc\) 个数就停下来后面不需要加入,并按随机顺序加入所有数,这样就可以通过了。
70 QOJ4635
显然有解必要条件是每个点在第一个图和第二个图中度数相等,事实上我们可以说明这是充要条件。
注意到操作可逆,希望找一个中间态,使得任意满足对应度数相等的图都可以变为中间态。
先考虑中间态是什么。每个点的度数确定的一张特殊图,让我们想到 Erdős–Gallai 定理:
非严格递增度数序列 \(d_1,d_2,\cdots,d_n\) 可以成为一张简单无向图的度数序列当且仅当:
- \(2 \mid \sum d_i\)。
- \(\forall 1 \leq k \leq n:\sum \limits_{i=1}^k d_i \leq \dbinom{k}{2}+\sum \limits_{i=k+1}^n \min\{k, d_i\}\)。
构造是取出度数最大的点,和之前度数前若干大的连边,然后归纳到 \(n-1\) 子问题。
中间态即为按照此归纳得到的图。考虑怎么操作至中间态。
按照这个构造过程,依次取出度数最大的点 \(u\),然后依次取出之前度数若干大的 \(v\),希望得到边 \((u,v)\)。若这条边已经在图中则直接可行,否则找到一条要被替换的边 \((u,x)\),希望操作将 \((u,x)\) 删去加入 \((u,v)\)。找一个点 \(w\) 满足 \((v,w) \in E\) 且 \((x,w) \notin E\),然后操作 \((u,x,v,w)\) 即可。显然这样的 \(w\) 必定存在,因为 \(v\) 的度数大于等于 \(x\) 度数,且 \((u,x) \in E\) 占掉了 \(x\) 的一个邻居。
实现上需要 bitset,复杂度 \(O(\dfrac{n^3}{w})\)。
71 QOJ4794
考虑判定序列合法性。
注意到相邻两项相同时,这条边肯定是缩点后 DAG 从前向后或者横着的边。为了让这样的边数尽量多肯定是希望缩点后 DAG 是条链。贪心算法相当于,依次考虑所有数,如果这条边是非关键边,即不使得 SCC 数量变小,那么如果目前没有连成链就连一条链上的边,否则不做任何操作。如果是关键边,将链头对应个点合并为一个点。不难说明贪心算法正确性。
对此直接 DP。\(f_{i,j,k}\) 表示考虑了 \(i\) 条边,构成了 \(j\) 个点的链,其前 \(k\) 个点被关键边缩在一起。前缀和优化转移,复杂度 \(O(mn^2)=O(n^4)\)。可以优化到 \(O(n^3)\),注意到 \(i\geq 2n\) 时只有 \(j=n\) 的状态。
72 QOJ5070
对方格表黑白染色并将黑格的颜色取反。问题等价于给所有 \(\texttt{?}\) 染色使得不存在同色的 \(2 \times 2\) 子矩阵。
先考虑我们能得到什么信息。如果一个 \(2 \times 2\) 子矩阵有三个同色和一个 \(\texttt{?}\),则 \(\texttt{?}\) 的颜色唯一确定。维护队列 BFS 式地每次取出一个 \(2 \times 2\) 矩阵判定,若判定成功则将新的矩阵加进队列,直至不存在这样的 \(2 \times 2\) 矩阵。
此时若尚未发生矛盾,我们声称一定有解。构造方法是每次随便取一个 \(\texttt{?}\) 染色随便一种颜色并将附近 \(2 \times 2\) 矩阵加进队列做上面这个操作。只需说明这么做不会导致矩阵不合法。注意到不合法形态一定形如 \(\begin{bmatrix} 0 & 0 & \\ 0 & \texttt{?} & 1\\ & 1 & 1 \end{bmatrix}\),其中三个 \(0\) 和三个 \(1\) 都在这次操作之前不完全存在,否则之前就可以扩展。不妨设 \(0\) 先出现三个,可以说明一定会先将 \(\texttt{?}\) 填为 \(1\) 而后再出现右下三个 \(1\)。
模拟即可,复杂度 \(O(nm)\)。
73 QOJ5148
枚举做法猜到支配对后就比较简单了。
我们猜测支配对数量不大。考虑点分治求出所有支配对。
对于目前分治中心 \(r\),求出目前连通块每个点 \(i\) 到 \(r\) 的距离 \(d_i\)。对于两个点 \(i<j\),可以发现 \(i,j\) 是支配对的必要条件是不存在 \(z \in (i,j)\) 满足 \(d_z \leq d_i\) 或 \(d_z \leq d_j\)。这样的 \((i,j)\) 对只有线性个,扫描线维护单调栈就可以在一层内线性时间找出所有支配对。所以总支配对个数 \(O(n \log n)\) 个。
然后就是查询区间子区间的权值最小值,扫描线,树状数组维护,复杂度 \(O(n \log^2 n + q\log n)\)。
74 QOJ6209
IMOSL 2019 C8。
首先容易做到 \(5n\)。维护集合 \(S\) 表示目前出度不超过 \(1\) 的顶点集合。注意到 \(|S| > 3\) 时,总会有 \(S\) 内的两个点之间没有询问过,进行询问并动态维护 \(S\)。最终 \(|S|=3\) 时再对 \(S\) 内所有点向外问一次,总次数不超过 \(5n\)。
在这个基础上调整一下。对每个点维护 \(a_i\) 和 \(b_i\) 表示出度和度数,即向外的出边数量和询问包含 \(i\) 的数量。对集合 \(S\) 按照 \((a_i,b_i)\) 二元组从小到大排序后,先枚举第一个点 \(u\),再枚举第二个点 \(v\),如果 \(u,v\) 没有边就询问,交互库看起来比较菜直接就过了,其实可以卡。
正解很有意思。通过调整询问顺序使得最终 \(|S| \leq 2\)。注意到 \(|S|=3\) 时其必定构成一个三元环才需要 \(5n\) 次询问,故我们希望 \(S\) 无环。
考虑维护三个集合 \(A,B,C\),分别表示目前度数为 \(0,1,2\) 的顶点集合,初始有 \(A=[n],B=\varnothing,C=\varnothing\)。
- 维护 \(x\) 初始等于任意 \(v \in A\),依次对于 \(A\) 中所有其他点 \(y\),询问 \(x,y\),若 \(x \rightarrow y\),则 \(x\) 加入 \(B\) 并令新的 \(x\) 为 \(y\),否则 \(y\) 加入 \(B\) 且 \(x\) 不变。询问 \(n-1\) 次,此时 \(|A|=1,|B|=n-1,|C|=0\)。不难说明此时询问的所有边不构成任何环。
- 对于仅剩的唯一的 \(x \in A\),与 \(B\) 内所有没询问过的点进行一次询问。若最终 \(x\) 度数仍小于等于 \(1\) 即答案为 \(x\),否则可得 \(A=\varnothing\)。
- 此时 \(B\) 内不存在环。每次选取任意两个 \(B\) 内未询问过的二元组并进行询问,删去其中一个后 \(B\) 仍然没有环。直至最后 \(|B|\leq 3\),而三元环不可行,于是 \(|B|=2\)。
这样就可以在不超过 \(4n\) 次询问内解决。
75 P16389
维护矩阵复杂度太大了过不去。
考虑 \(a_{n}=5a_{n-1}+4a_{n-2}+3a_{n-3}+2a_{n-4}+a_{n-5}\) 是常系数齐次线性递推。特征根方程 \(x^5-5x^4-4x^3-3x^2-2x-1=0\) 的解在模意义下若存在,以及可以还原 \(a_i=i(0 \leq i \leq 4)\),那么将 \(x_n\) 写成 \(x_n=\sum \limits_{i=0}^5 w_iq_i^n\) 形式维护线段树就行。实际上这个模数确实能找到对应的根然后高斯消元出 \(w\),然后就做完了。
76 P16913
注意到 \(10^k\equiv 1\pmod {R(k)}\),所以 \(n \bmod R(k)\) 只需要将 \(n\) 从低到高每 \(k\) 位分一段判断每段总和是否为 \(R(k)\) 的倍数。显然每段总和不超过 \(9\times R(k)\times \lceil \dfrac{n}{k}\rceil\),枚举总和是 \(R(k)\) 的多少倍,复杂度是 \(O(n \log n)\) 的。而总和是否等于某个值只需要取质数 \(P\) 在模意义下考虑即可得到较高的正确性。总复杂度 \(O(n \log n)\)。
77 P16596
建圆方树,只需要查询路径线性基,建立每个点到根前缀线性基即可。
78 CF2237G
考虑在序列里放一个 \(p^k\),其中 \(p\) 是质数,\(k\) 是满足 \(p^k \leq 10^6\) 的最大的整数 \(k\)。那么询问这个位置和另一个位置的 \(\gcd\),就可以求出另一个位置的数分解质因数后在 \(p\) 上的幂次。
在序列里放前 \(150\) 个质数 \(p\) 对应的 \(p^k\),可以发现 \(10^6\) 内质因数分解只含前 \(150\) 个质数的数有大于 \(3 \times 10^5 > \dfrac{10^6}{4}\) 个。那么前面 \(\lceil \dfrac{10n}{9} \rceil\) 肯定是为了让值域进一步扩大。
对于每个数 \(x\),显然可以直接传 \(\lfloor \dfrac{x}{4} \rfloor\),通过大于 \(3 \times 10^5\) 种数传递信息。而 \(x \bmod 4\) 是 \(2\) 个 bit 信息。注意到 \(2^{18} < 3\times 10^5\),所以可以将连续 \(9\) 个位置的 \(x \bmod 4\) 一起传。这样每 \(9\) 位花 \(10\) 个位置,总位置数即不超过 \(\lceil \dfrac{10n}{9} \rceil+150\),询问次数显然符合要求。
79 ARC223E
将序列差分,则本来四种情况:
- \(0,0\rightarrow 0,1,1,0\)。
- \(0,1 \rightarrow 0,1,0,1\)。
- \(1,0 \rightarrow 1,0,1,0\)。
- \(1,1 \rightarrow 1,0,0,1\)。
可以写成两种情况:
- \(0 \rightarrow 1,0,1\)。
- \(1 \rightarrow 1,1,1\)。
注意到操作过程中 \(0\) 个数不变,\(1\) 奇偶性不变,先判掉这个必要条件。
然后考虑两个 \(0\) 之间 \(1\) 的个数,发现三次操作 \(1\) 可以改为一次操作 \(1\) 两次操作 \(2\),故每个 \(0\) 上进行的操作 \(1\) 次数不超过 \(2\)。从前往后对于 \(0\) 的位置线性 DP 即可。复杂度线性。
80 CF2229I
对于单个根,直接树上背包,复杂度 \(O(n^2)\)。考虑换根怎么做。
对于 \(u\) 需要处理子树外的信息 \(g_{u,i}\),看起来需要记 \(O(n)\) 的状态,然后向子树内递归需要合并,复杂度至少 \(O(n^3)\)。然而注意到在 \(u\) 的子树外最多选 \(k-sz_u\) 个点,最多选 \(k\) 个点,所以实际上需要记的也只有 \(O(sz_u)\) 个信息。
在点 \(u\) 递归进儿子 \(v\) 的子树时,需要将 \(g_u\) 与 \(u\) 的除了 \(v\) 的所有儿子合并,这个背包是无法撤销的,只能前缀后缀合并。将 \(g_u\) 看作所有儿子中最靠前的一个信息进行合并,那么每个儿子 \(v\) 的信息是前缀和后缀的信息并,后缀信息的大小是若干子树大小和,而 \(g_v\) 只需保留 \(sz_v\) 个点值,所以复杂度 \(O(sz_v(sz_u-sz_v))\),求和是 \(O(n^2)\) 的。而对于前缀信息,多了一个大小为 \(sz_u\) 的 \(g_u\) 信息,直接合并会导致复杂度不对,而实际上如果剩下子树大小为 \(s\),需要保留的有效区间是 \([\max\{0,k-s\},k]\),当 \(s<k\) 后,每合并一个大小为 \(w\) 的子树会使得有效范围减小 \(w\),可以发现无论如何从前往后扫一个子树进行合并,只需要花后缀子树大小和乘以当前子树大小的代价合并,从而总复杂度 \(O(n^2)\)。
81 CF2229H
如果没有 \(\texttt{?}\),类似子序列自动机,每次应该匹配最靠前的满足区间内 \(1\) 的个数奇偶性合法的位置,因为选较后的可以调整。然后在自动机的 DAG 结构上 DP,本质是 DAG 上路径计数。复杂度线性。
有 \(\texttt{?}\) 时直观想法是类似上述做法,找最靠前的满足区间内有 \(\texttt{?}\) 或没有 \(\texttt{?}\) 且有偶数个 \(1\) 的点进行转移,然而并不正确。考虑之前没有 \(\texttt{?}\) 这样做的正确性,本质是如果有两个目前的点 \(i<j\),必定满足 \((i,j]\) 之间有偶数个 \(1\),从而 \(j \rightarrow x\) 则 \(i \rightarrow x\) 也可行。而存在 \(\texttt{?}\) 时,可能有 \((i,j]\) 之间有奇数个 \(1\),这是因为曾经的转移可能是通过 \(\texttt{?}\) 调整奇偶性而来。注意到 \((i,j]\) 之间有奇数个 \(1\) 当且仅当 \((i,n]\) 和 \((j,n]\) 后缀内 \(1\) 的个数奇偶性不同,从而可以将 DFA 状态从 \([n]\) 扩展到 \([n]^2\),两个位置 \(x,y\) 分别表示 \((x,n]\) 内有奇数或偶数个 \(1\) 时的最前匹配位置。在此基础上做 DAG 的路径计数即可,复杂度 \(O(n^2)\)。
82 CF2229G
称停留过的点为关键点,没停留过的为非关键点,只考虑关键点之间的转移,发现路径上经历过的关键点的权值单调不降。否则还不如在之前多停留一会将后面权值较小的点设为非关键点。
另外设 \(t_i\) 表示 \(i\) 最早到达时刻,\(t_i\) 不难求出。发现最优路径上每个关键点 \(i\) 都一定恰好 \(t_i\) 时刻到达,并且每个关键点的下一步转移必定是向左和向右第一个权值比其大的关键点。至此只有线性个状态和转移,精细实现可以线性复杂度。
83 CF2226G
将回文串分为两部分,分别是左侧 \(a\) 原有的,以及跨越 \(a\) 和 \(p\) 的。前者用你喜欢的方式求出序列长度为偶数回文串个数 \(c\)。后者的回文中心一定在 \(a,p\) 分界点或其左侧。不断同时删去开头末尾两个相等字符直至回文串不包含 \(p\) 任何字符后得到一个 \(a\) 的回文后缀,所以所有这样的字符串可以写为 \(x+s+\mathrm{rev}(x)\),其中 \(s\) 为 \(a\) 的一个长度为偶数的回文后缀,\(x\) 是一个所有字符互不相同的序列。枚举偶数回文后缀 \(s\),向前求出一段尽量长的,所有字符互不相同的字符串 \(x\),并将 \(\mathrm{rev}(x)\) 加入 Trie 上。那么一个 \(p\) 对应的权值即为 Trie 上匹配到不能匹配的点到根点权和,然后计数部分是平凡的。
唯一的问题在于建 Trie 的复杂度是否正确。也就是所有长度为偶数回文后缀 \(s\) 对应向前找极长的互不相同的 \(x\) 的长度和是什么规模的。我们声称其是 \(O(n)\) 的,从而整体复杂度 \(O(n \log n)\),瓶颈仅在于快速幂。
接下来证明其是线性的:
考虑位置 \(i\) 出现在 \(x\) 中的次数,我们说明其不超过 \(2\)。考虑反反证,若存在 \(i \in x_1,x_2,x_3\),对应后缀 \(s_1,s_2,s_3\),满足 \(|s_1|<|s_2|<|s_3|\),根据回文后缀性质我们知道 \(s_3\) 存在长度为 \(|s_3|-|s_2|\) 的周期,可以导出 \(x_1\) 中有相同的数,矛盾。\(\square\)
84 CF2219D
\(p\) 是排列随便做。
85 CF2217H
DP。\(f_{u,v}\) 表示 \(u\) 子树,和儿子 \(v\) 交换点权的答案。
86 CF2209F
操作一次后就只有叶子有值了,所以一开始的根固定后,接下来就是前 \(k-1\) 大的叶子权值和。
然后换根做一下发现每次换根只影响 \(O(1)\) 个叶子,维护数据结构插入删除求前 \(k\) 大和就行了。复杂度 \(O(n \log n)\)。
87 CF2208E
序列 \(X\) 合法当且仅当 \((X_i,i)\) 区间任意两个要么不交要么包含,证明显然。
直接区间 DP。\(f_{l,r}\) 表示只考虑 \(i \in (l,r]\),且 \(X_i \geq l\) 的方案数,复杂度 \(O(n^3)\)。内部转移形如 \(f_{l,r}=\sum \limits_{c} f_{l,c}f_{c,r-1}\),难以优化。
首先可以对每个 \(X_i \neq -1\) 的 \((X_i,i)\) 区间内部处理,然后将其缩成一个点,这样只需要考虑 \(X_i=i-1\) 或 \(X_i=-1\) 的情况。
注意到上述 \(O(n^3)\) 的 DP 转移实质是,对于区间 \((l,r]\),枚举 \(X_r=c\),然后左右两边 \((l,c],(c,r]\) 贡献相乘。然而如果我们只考虑 \((l,r-1]\) 的情况,然后再插入 \((X_r,r]\),可以发现只需要记每个前缀构成了多少个极大区间。这样转移就可以前缀和优化了。复杂度 \(O(n^2)\)。
88 CF2205G
等价于限制 \(\gcd(i \oplus j,j \oplus k) \mid n\)。显然 \(i \oplus j \leq 2m\),枚举 \(d\) 计算有多少 \(i,j,k\) 满足 \(d \mid \gcd(i\oplus j,j\oplus k)\),然后容斥。
对于单个 \(d\),枚举 \(j\),记 \(c_j = \sum \limits_{d \mid x} [x \oplus j \in [0,m]]\)。贡献就是 \(\sum c_j^2\)。
枚举 \(j\) 复杂度太大了。枚举 \(d \mid x\),复杂度是调和级数的。然后 \(x \oplus j \leq m\) 构成 \(O(\log V)\) 个连续区间,变成若干区间加 \(1\) 后全局查询所有数平方和。把这些区间离散化然后差分。复杂度 \(O(m \log^3 m)\),瓶颈仅在于排序,可以无压力通过。
进一步将结构放在 Trie 上做子树加全局平方和就是 \(O(m \log^2 m)\) 的。
89 CF2217G
好无聊的题。
设每个点的 \(b_i\) 为这个点的点权异或上所有儿子点权。那么代价就是 \(\max(s_1,s_2)+b_{\mathrm{root}}\),\(s_1,s_2\) 分别是根左右儿子子树所有点的 \(b\) 之和,\(b_{\mathrm{root}}\) 为根的 \(b\) 值。证明显然。
注意到点权 \(a\) 和 \(b\) 是双射,所以计算 \(a\) 和计算 \(b\) 方案数等价。
枚举左儿子点数 \(x\),右儿子点数 \(n-1-x\),二叉树方案数是卡特兰数,只需计算左右两侧和均不超过 \(k\) 减去均不超过 \(k-2\) 的。这个东西形如计算 \(F(n,k)=\sum \limits_{i=0}^k \dbinom{n}{i}\)。注意到 \(n \gets n \pm 1\),\(k \gets k \pm 1\) 都可以 \(O(1)\) 计算新的答案。总复杂度线性。

浙公网安备 33010602011771号