2026.8 做题记录
1 P16559
直接做是 \(O(n \log n)\) 次询问,无法通过,猜测应该和字符集大小有关。
记 \(S[i \cdots n]\) 表示从 \(i\) 开始的后缀。考虑排序后相邻两个后缀 \(S[x \cdots n]\) 和 \(S[y \cdots n]\),满足 \(S[x \cdots n] < S[y \cdots n]\),那么大概率有 \(S[x + 1 \cdots n] < S[y + 1 \cdots n]\),除非 \(S_x \neq S_y\),这样的情况只会出现至多 \(|\Sigma|\) 次。
考虑从后往前加入每个后缀,加入 \(S[i \cdots n]\) 时考虑如何求出其排名。考虑曾经的所有后缀排序后,满足 \(S[x + 1 \cdots n] < S[y + 1\cdots n]\) 的连续段,发现整个连续段中只有唯一一个符合条件的位置可能成为 \(S[i \cdots n]\) 的位置,前提是 \(S[i \cdots n]\) 没有增加满足 \(S[x + 1\cdots n] > S[y + 1 \cdots n]\) 的位置。那么只有 \(|\Sigma|\) 个位置可能成为结果,二分即可。二分后判定一次,如果不合法则意味着这个点增加了 \(S[x + 1 \cdots n] > S[y + 1 \cdots n]\) 的位置个数,此时直接在后缀中二分。总次数不超过 \(n(\lceil \log_2 |\Sigma| \rceil + 1) + |\Sigma| \lceil \log_2 n \rceil\),跑不满,可以通过。
2 P16565
第一个限制等价于原图的圆方树构成一条链,两端分别包含 \(1,n\)。
第二个限制等价于原图构成 \(1,n\) 为端点的两端点广义串并联图。
总而言之,一个图符合要求当且仅当可以按照以下方式将图变为一条 \((1,n)\) 的边:
- 选择一个度数为 \(2\) 的点 \(x\) 满足 \(x \neq 1\) 且 \(x \neq n\),设其邻居分别为 \(u,v\),将 \((u,x),(x,v)\) 边删去,加入边 \((u,v)\),允许加入重边。
- 选择一条重边将其删去。
与一般广义串并联图不同之处在于没有删一度点,因为其不符合限制一。
对原图进行上述判定即可确定原图是否符合限制,现在考虑加边 \(u,v\) 后如何判定。
我们声称加入边 \(u,v\) 后图仍合法当且仅当原图存在操作方案使得某个时刻存在边 \((u,v)\)。充分性显然,在这个时刻我们可以将新加入的边和这条边叠合重边,从而得到新图的操作方案。必要性考虑若 \(u,v\) 之间的新加的边没有被叠合重边操作缩合,则不可能用第一类操作将这两个点删去。
原问题只需要对于每个簇的每个界点 \(x\),维护这个簇内进行若干操作能与这个点 \(y\) 构成边 \((x,y)\) 的 \(y\) 的点权和即可。复杂度 \(O(n \log n)\)。
3 P16572
注意到所有本来的连续段操作过程中也是连续段,记连续段长度依次为 \(w_1,w_2,\cdots,w_n\),每次操作就是选取 \(i\) 使得 \(w_i=w_{i+1}\),然后将序列 \(w_{i-1},w_i,w_{i+1},w_{i+2}\) 变为 \(w_{i-1}+w_i,w_{i+2}+w_i\)。在序列两端补若干 \(0\) 以解决边界问题。
对此直接区间 DP 即可。记 \(f_{l,r}\) 表示将区间 \((l,r)\) 全部删空的方案数即可转移,细节很繁琐。
4 P17131
分块,考虑每个块维护前缀 \(\min \times \max\) 的前缀和以维护区间和,询问暴力重构散块,整块打标记,询问从前往后考虑每个块,之前的最小值最大值分别为 \(m_1,m_2\),考虑 \(m_1,m_2\) 在这块中分别会有一段前缀成为贡献,例如长度分别为 \(l_1,l_2\),不妨假设 \(l_1\leq l_2\),在 \(l_2\) 之后只需要查询后缀的前缀 \(\min \times \max\) 之和,\(l_1\) 之前每个点贡献都是 \(m_1 \times m_2\),中间部分要查询 \((l_1,l_2)\) 内前缀 \(\min\) 和,可以类似维护。复杂度瓶颈仅在于找出 \(l_1,l_2\),在单调栈二分,那么重构是 \(O(B)\) 的而查询是 \(O(B \log n)\) 的,可以平衡到 \(O(n \sqrt {n \log n})\)。进一步 \(m_1,m_2\) 的查询可以离线下来排序,这样可以做到 \(O(n \sqrt n)\)。
5 P17126
按询问的 \(x\) 扫描线,将交点 \(x\) 坐标式子写下来,只需要维护凸包在上面二分。复杂度 \(O(n \log n)\)。
6 QOJ14575
先考虑判定点权 \(w\) 是否可行。
不失一般性假设图 \(G\) 连通,考虑是否存在一个排列 \(p\) 使得按照 \(p_1,p_2,\cdots,p_n\) 操作合法,若存在则不断进行此操作即可确定 \(w\) 可无限操作,可以发现 \(p\) 符合条件当且仅当 \(\forall i \in [1,n]:w_{p_i} \geq \sum \limits_{j=1}^{i-1} v_{p_j,p_i}\)。找这样的排列 \(p\) 只需要从后往前每次选任意一个可以选的即可。
我们声称 \(w\) 可行当且仅当可以找到这样的排列 \(p\)。充分性显然,考虑说明必要性。对于任意无限长操作序列 \((c_1,c_2,\cdots)\),显然每个点都进行了无限次操作,取出每个点第一次出现的位置发现其就是一个可行的 \(p\)。
现在已经 \(O(n)\) 解决判定了,对于构造随便取一个 \(p\) 并从前往后令 \(w_{p_i} = \sum \limits_{j=1}^{i-1} v_{p_j,p_i}\) 即可构造到总和的下界 \(\sum v_{i,j}\)。
7 QOJ15041
显然的贪心策略是每次选一个能选的最小的点,能选当且仅当其 \(d_u\) 级后代存在选过的,且不存在其某个祖先的限定内邻域包含其且那个祖先还没选。
直接做是 \(O(n^2)\) 或者更大,但是注意到有解要满足任意两个内邻域要么不交要么包含,容易通过数据结构或者做一些简单观察做到 \(O(n \log n)\)。
8 P15677
在 \(a\) 的 Trie 上考虑,注意到如果子树大小大于等于 \(3\),那么这一位 \(p,q\) 必定相同,因为此时必定存在两个数之后最高位相同,若 \(p,q\) 最高位不同直接导出矛盾。
所以限制自然有 \(p,q\) 前若干位相同,后面的位从高到低钦定相等关系,维护 \(x\) 的 Trie 上的对应节点即可。
9 P15723
把 \((A-B-C+D)^2\) 拆开做,只有两项乘积的形式,直接枚举右下角,维护单调栈即可,细节很繁琐。
10 P15717
由于端点互不相同,注意到 \([l,r)\) 若被拆为 \([l,x)\cup [x,r)\),则有贡献只能是形如原来有 \([k,x)\) 或 \([x,z)\) 状物,并且这个区间和 \([l,r]\) 区间构成的两个有交但不包含的区间和外界独立。
所以对于所有 \(i<j\) 满足 \([l_i,r_i)\) 和 \([l_j,r_j)\) 有交但不包含的区间连边,边权是这条边能减少的花费。即求一般图最大权匹配。复杂度 \(O(n^3)\)。
11 P15711
记 \(b_i = \max(0,a_{i+1}-a_i)\) 与 \(c_i = \max(0,a_i-a_{i+1})\)。容易知道 \(b_i-c_i=a_{i+1}-a_{i}\)。
考虑将计数合法的 \(a\) 改为计数合法的序列对 \(b,c\)。考虑合法的序列 \(b,c\) 满足的限制:
- \(\forall i \in [0,n]: \sum \limits_{j=0}^i b_j-c_j \geq 0\),因为 \(\sum \limits_{j=0}^{i} b_j-c_j=a_{i+1}\geq 0\)。
- \(\sum \limits_{j=0}^n b_j=\sum \limits_{j=0}^n c_j=k\),这是因为 \(a_{n+1}=0\)。
- \(\forall i \in [0,n]:b_i \times c_i = 0\)。
任意满足上述条件的 \(b,c\) 和满足条件的 \(a\) 构成双射。
将 \(b,c\) 各看作一条 \((0,0)\) 到 \((n,k)\) 的每次直往右边或上边的路线,则相当于计算有多少路线对满足:
- 每次各在直线上走一步,不存在某个时刻满足第二条线的 \(y\) 严格大于第一条线的 \(y\)。
- 不存在某个 \(x \in [0,n]\) 满足两条线在 \(x\) 上均有向上。
先考虑只有第一个限制。考虑最靠前的时刻满足第二条线 \(y\) 大于第一条线 \(y\),则上一个时刻两者 \(y\) 必定相同,下一步第二条线向上而第一条线向右。两个时刻 \(y\) 相同则 \(x\) 也相同,均处于 \((x,y)\),下一步第一条线处于 \((x,y+1)\),第二条线处于 \((x+1,y)\)。考虑将第二条线整体向右下平移一单位,那么第二条线起点 \((1,-1)\),终点 \((n+1,k-1)\),限制变为要求第一条线和第二条线不交,类似 LGV 引理在第一次相交处交换终点可得方案数 \(f(n,k)=\dbinom{n+k}{n}^2 - \dbinom{n+k}{n-1}\dbinom{n+k}{n+1}\)。
加上限制二,考虑反演,记答案为 \(g(n,k)\) 表示没有同时向上的方案数,则 \(f(n,k)=\sum \limits_{i=0}^k g(n,k-i)\dbinom{n+i}{i}\) 意思是枚举有多少个同时向上的位置,容斥系数是插板。考虑如何反演求出 \(g\)。
对 \(f(n,k)\) 构造生成函数 \(F(x)=\sum \limits_{i=0}^k f(n,i)x^i\),\(G(x)\) 同理对 \(g(n,k)\) 构造生成函数,而 \(h(x)=\sum \limits_{i=0}^{+\infty} \dbinom{n+i}{i}x^i=(1-x)^{-(n+1)}\)。我们有 \(F(x)=G(x)h(x)=G(x)(1-x)^{-(n+1)}\)。那么 \(G(x)=F(x)(1-x)^{n+1}\)。展开可知 \(g(n,k)=[x^k]G(x)=\sum \limits_{i=0}^k f(n,i)\dbinom{n+1}{k-i}(-1)^{k-i}\)。复杂度线性。
12 P15714
显然我们可以只保留 \([1,n]\) 内的,然后考虑排列合法的充要条件,显然是 \(\forall i \in [2, n]: p_i \in [\min \limits_{j=1}^{i-1}p_j - k, \max \limits_{j=1}^{i-1} p_j + k]\)。
对于限制 \([l,r]\) 要求 \(p_1 \in [l,r]\),考虑 \(l=r\) 也就是限制 \(p_1=x\) 时的答案。注意到 \((x,n]\) 部分和 \([1,x)\) 部分独立,分别计算答案乘以 \(\dbinom{n-1}{x-1}\) 即可。
考虑计算 \([1,x)\) 答案记为 \(f_{x-1}\),显然 \((x,n]\) 的答案就是 \(f_{n-x}\),因为两边是对称的。
考虑 \(f_n\) 递推式,此时有 \([1,n]\) 所有点,目前处于 \(n+1\),枚举下一个位置 \(x \in [n+1-k,n]\),贡献 \(f_{x-1}f_{n-x}\dbinom{n-1}{x-1}\)。所以有 \(f_n = \sum \limits_{x \in [n-k+1,n]} f_{x-1}f_{n-x}\dbinom{n-1}{x-1}\)。显然 \(n-x<k\),此时 \(f_{n-x}=(n-x)!\)。所以 \(f_n = \sum \limits_{x \in [n-k+1,n]} f_{x-1}(n-x)!\dbinom{n-1}{x-1}\)。这个式子显然可以分治 NTT 优化做到 \(O(n \log^2 n)\)。
查询先改为前缀差分,然后形如计算 \(\sum \limits_{i=1}^r f_{i-1}f_{n-i}\dbinom{n-1}{i-1}\),相当于只保留前缀的卷积,分块 NTT,复杂度 \(O(n\sqrt {q\log n}+n\log^2 n)\),可以通过。
13 QOJ14436
考虑目前的范围 \([0,d]\),遇到 \(h\) 时,若 \(d<h\) 则 \(d\) 不变,否则变为 \(\max(h-1,d-h)\)。离线从前往后扫维护平衡树,也就是类似插入标记回收即可。复杂度 \(O((n+q)\log n)\)。
14 QOJ14432
先不断删去入度为 \(0\) 的点直至图中不存在这样的点,问题等价于对每个点计算删去这个点后图能进行拓扑排序的删入度为 \(0\) 的点的次数的最大值。记 \(S_u\) 表示一开始删去 \(u\) 后能删的集合,注意到任意两个 \(S\) 要么不交要么包含构成树形结构。按随机排列 \(p_1,p_2,\cdots,p_n\) 加入所有点并求出 \(S_u\),注意跳过曾经访问过的点,这样期望复杂度 \(O(n \log n)\)。
15 HDU 1006
显然集合大小就是 \(\lceil \dfrac{n}{2} \rceil\),直接构造就是大于一半的所有数。
考虑如何最小化字典序。注意到对于奇数 \(x\),\(S_x = \{x\times 2^k \mid k \geq 0, 2^kx \leq n\}\),构成 \([n]\) 的一个无交划分,并且每个 \(S_x\) 中恰好要选一个数。记 \(c_x\) 表示 \(S_x\) 中选了 \(x2^{c_x}\),我们发现限制等价于 \(\forall x \mid y, x< y : c_x > c_y\)。从大到小依次令 \(c_x = \max \limits_{x \mid y, y > x} c_y + 1\) 自然最小化了字典序。
16 HDU 1008
显然 \(x_i \in [l,r]\) 的限制我们只关心 \(x_1 \in [l,r]\) 且 \(x_n \in [l,r]\)。图的限制缩点后就是说 \(0,1\) 分别是一个 DAG 上包含 \(1,n\) 的割集状物。从前往后数位 DP,记录 \(x_1,x_n\) 是否卡到上下限制即可。带修只需要线段树维护矩阵乘法做 DDP。
17 HDU 1007
将连续段看作相邻的 \(10\) 个数,如果最后一个位置是 \(1\) 要特殊考虑,但基本可以视作这个值。我们知道若 \([l_1,r_1] \subseteq [l_2,r_2]\) 那么一定有 \(f(l_1,r_1) \subseteq f(l_2,r_2)\),\(f(l,r)\) 表示区间 \([l,r]\) 内连续段个数。
那么离线下来按照答案 \(c\) 从大到小扫描线求出所有答案为 \(c\) 的区间。显然我们只需要维护极大区间,这些区间左右端点分别递增,\(c\) 在扫描线过程中对连续段的个数影响是区间加状物,只需要每次修改后不断取出全局 \(\max\) 且若其大于等于 \(k\) 则分裂出小的询问区间即可。复杂度 \(O((n+q)\log n)\)。
18 HDU 1011
熟知结论 \(\mathrm{MEX}\) 等于补集 \(\min\)。所以问题等价于统计 \(\min\)。
只需要考虑 \(|S| \leq 3\),只有 \(|S|=3\) 难以考虑,\(|S| \leq 2\) 是简单的。相当于求有多少 \(i<j<k\) 满足 \(\min(a_i,a_j,c_k),\min(b_i,b_j,b_k),\min(c_i,c_j,c_k)\) 分别位于 \(i,j,k\) 三列上。对此容斥。不在三列上则是在一列或两列上,做个三维偏序即可。复杂度 \(O(n\log^2 n)\)。
19 QOJ14434
操作所得结果不超过 \(3\),所以最终结果一定是有段后缀不操作,前缀分别分为若干区间,每个区间结果 \(\leq 3\) 且单调不降。\(f_{i,j}\) 表示 \([1,i]\) 前缀最后一个区间值是 \(j \in [0,3]\) 时的答案。
看起来操作很厉害,猜测存在阈值 \(K\) 满足长度大于 \(K\) 的长度为奇数的区间无论如何均能合成出 \(0,1,2,3\)。据说 \(K=17\)。
然后容易将上述 DP 优化到 \(O(nK^3)\),瓶颈是对做区间 DP 判定每个长度不超过 \(K\) 的奇数长区间能否合成出 \(0,1,2,3\)。常数很小可以通过,转移过程可以分步转移一次做到 \(O(nK^2)\)。
20 QOJ14139
我们声称好的点是前若干行。找到最小的 \(i\) 满足 \(i \geq 2\) 且 \(\sum \limits_{j=i}^{i+u-1} s_j \leq r\),则答案为 \(\sum \limits_{j=1}^{i+u-1} s_j\)。线段树二分即可,复杂度 \(O(n\log n)\)。
证明考虑先说明 \(i+u\) 及其之后的行不行。任意一次操作最多移动到第 \(i\) 行,然后由于区间和足够小就会移会 \(i+u\) 及其之后。
接着说明 \(i+u-1\) 之前的行都可以。对于任意一个起点说明操作一次肯定离第一行更近即可。这是比较显然可以推出的。
21 QOJ14718
考虑现在计算 \(i\) 的答案,我们希望尽量早相遇。假设 \(i,j\) 在边 \((u,v,w)\) 上相遇,\(i\) 走到 \(u\),\(j\) 走到 \(v\) 然后在中间相遇,相遇时间为 \(\dfrac{d(i,u)+d(j,v)+w}{2}\)。相遇后可以走到 \(u\) 或 \(v\) 然后再走到 \(1\),分别需要的总时间为 \(d(j,v)+w+d(1,u)\) 或 \(d(i,u)+w+d(1,v)\)。
固定 \(i,u,v\) 后,我们显然希望找一个 \(j\) 满足 \(d(j,v)\) 最小。另一方面,对于所有 \(x\) 满足 \(d(x,u)>d(i,u)\),\(x\) 通过 \((u,v)\) 这条边相遇不如和 \(i\) 在之前相遇。所以对于每个点只需要找距离其最近的关键点并更新答案。复杂度 \(O(m \log m)\)。
22 QOJ14810
容易发现只有可能正确代码认为一个点是割点而错误代码认为不是。
进一步地,这样的点符合条件当且仅当其是割点,且删去其后所有其余连通块中与其相邻的点至少有两个。不难说明正确性。复杂度线性或 \(O(n \log n)\)。
23 QOJ14802
注意到 \(c\) 是没有用的,因为取 \(x,y\) 后可以将 \(x,y\) 同时向远端放大从而忽略 \(c\) 的量级的影响。
现在变为求一组整数 \(x,y\) 最大化 \(a_ix+b_iy<0\) 的 \(i\) 的个数。显然每个限制是一条包含原点的直线的一侧,将幅角拉出来做区间加查询覆盖次数最大的点即可。复杂度 \(O(n \log n)\)。
24 QOJ14945
注意到 \((u,v) \notin E\) 时,直接将 \(u,v\) 所有邻边都改为入边即满足要求,现在考虑 \((u,v) \in E\)。
此时显然图为树无解,否则我们声称一定有解。考虑是否存在包含边 \((u,v)\) 的简单环。若存在,找到一个这样的环后每次断掉其上一条弦并变为更小的一个环,直至环上没有弦,将环上边按照环的任意一个顺序定向,其余边都向环内指即可。
\((u,v)\) 不属于任何环,即这条边是割边时,从 \(u\) 开始求出每个点到 \(u\) 的最短路,并选取一个距离 \(u\) 最近的 \(v\) 满足 \(v\) 在原图中在某个简单环上,找出这个环并不断缩环直至没有弦。然后定向形如 \(u\) 一路沿着最短路走到环,环按照环的方向定向即可。
25 QOJ14943
从高位到低位 DP 就行。
26 HDU 1001
题如其名。可以说明所有 runs 的长度减去两倍周期总和是 \(O(n \log n)\) 的,直接从前往后 DP,将所处 runs 里的贡献减去即可。
27 QOJ14944
注意到贪心策略:每次若存在要打的牌则打掉,否则打出下一次最早出现的时间最晚的牌。
可以证明对于任意排列 \(\pi\),上述策略达到了轮数下界,下界为 \(f_i = \max(f_{i-1},f_j)+1\),\(j\) 为上一个和 \(a_i\) 相同的位置,若不存在则将 \(f_j\) 改为 \(p_{a_i}-n\),\(p_{a_i}\) 表示 \(a_i\) 在 \(\pi\) 中的位置。
期望的计算转为计算 \(P(f_m \leq k)\),枚举 \(k\),限制从 \(f_m \leq k\) 开始向前递推即可得到一个多项式算法。注意到 \(p\) 均为 \(0\) 和 \(p\) 均为 \(n\) 相比,\(f_m\) 只差了 \(O(n)\),故本质只需要算 \(O(n)\) 种 \(k\),而 \(k\) 增加时要么所有 \(p\) 限制不变,要么加上一个相同的数。复杂度 \(O(n^2+m)\)。
28 QOJ14949
问题等价于询问 \(S=\{v,a_l,a_{l+1},\cdots,a_r\}\) 在长度为 \(m\) 的值域环上相邻差的最大值。
如果没有 \(v\),考虑回滚莫队,只删不加,这样只需要离散化后维护双向链表即可。
加入 \(v\) 时,可能会将一段拆为两端,问题一是找到 \(v\) 插入的段的位置,相当于维护区间前驱后继,主席树或者类似结构即可,不在复杂度瓶颈,因为只需要询问 \(O(n)\) 次。另一方面如果 \(v\) 插入的段是最大的段,则分裂后不一定有之前次大段大,所以回滚莫队过程中还要维护次大段。此时删除一个位置如果两边分别是最大和次大则难以求出新的次大,但是此时必定有最大至少为次大两倍,次大段不再有意义,直接选择不维护即可。
复杂度 \(O(n \sqrt n)\)。
29 QOJ14940
考虑 \(i<j\),\(h_j-h_i=(j-i)(j+i+\dfrac{2b}{a})\)。显然有 \((j-i)(j+i)=j^2-i^2\) 是 \(\dfrac{1}{a}\) 的倍数,所以任意 \(h_j-h_i\) 都是 \(\dfrac{1}{a}\) 的倍数,答案同理也是,二分答案 \(x\) 表示答案是 \(\dfrac{x}{a}\)。判断是否存在 \(\geq k\) 个 \((i,j)\) 使得 \(h_j-h_i \leq \dfrac{x}{a}\)。
也就是要求 \((j-i)(j+i+\dfrac{2b}{a})\leq \dfrac{x}{a}\)。枚举 \(j-i=d\),那么 \(d(2i+d+\dfrac{2b}{a})\leq \dfrac{x}{a}\) 可以解出 \(i\) 对应的范围。而实际上 \(d\) 只要枚举到 \(O(\sqrt k)\),因为 \(h_j - h_i \leq v \rightarrow h_{j'}-h_{i'} \leq v\),其中 \(i \leq i' \leq j' \leq j\)。所以复杂度 \(O(\sqrt k \log k)\)。
30 QOJ14942
考虑开头放 \(1\) 到 \(m\),这样后手可以求出 \(S_0,S_1\) 分别是什么。
然后如果 \(m\) 是质数,直接在后面将 \(1\) 到 \(m\) 循环位移 \(x\) 次即可。否则注意到后面还有 \(2m\) 位,而 \([m,2m]\) 之间一定有质数 \(p\),将 \(1,2,\cdots,m,1,2,\cdots,p-m\) 循环位移即可。
31 HDU 1001
比较无脑的考虑直接做分割凸包,每次遇到一条线就枚举目前所有凸包并尝试分裂或者确定凸包在线的一侧。复杂度本不足以通过但实则可以轻松通过。
题解的做法是将第 \(k\) 大改为 min-max 容斥然后枚举 \(T\) 计算最小值和半平面交,复杂度看起来更加正确。
32 HDU 1002
先考虑选 \(x_i=a_i\) 或 \(x_i=b_i\),选完后必须满足所有数出现次数为偶数次,这显然是必要条件,所以先解决这一步。
这个问题等价于对每个 \(i\) 连边 \((a_i,b_i)\),每条边选择一个端点使得每个点被选偶数次。可以改为每条无向边定向使得每个点入度为偶数。显然必要条件是每个连通块内边的个数是偶数,其实也是充分条件,构造考虑取一棵 DFS 生成树,非树边随便定向,树边从底向上构造,每个点使用其和父亲的边调整。由于总边数奇偶性合法所以根自然合法。
接下来可以说明只要取的 \(x_i\) 满足所有数出现次数为偶数,且所有颜色 \(c_i\) 都出现偶数次,则必定有解。考虑将颜色看作左部点,\(x_i\) 看作右部点,连边 \((x_i,c_i)\) 得到一个二部图,每个点度数都是偶数,将所有边定向使得每个点入度等于出度。跑个欧拉回路即可。
33 HDU 1004
显然直径最多增加 \(2\)。设直径长度 \(x\),考虑 \(k=x+1\) 和 \(k=x+2\),后者是选一条直径在两端加一个点,前者可能是选一条直径在一端加一个点,也有可能选一条长度 \(x-1\) 的链在两端各加一个点。然后分类讨论一些东西。
我写的东西不用动脑,直接求出每个点最近和次近的 \(a_i \geq 2\) 的点,然后点分治计算答案。
34 HDU 1008
对于每个操作区间和每种颜色判定这个操作是否可以将区间染色为这种颜色。按照时间从前往后扫,在树上维护信息即可。之后相当于在树上选若干点使得不存在两个点有祖先关系,这是容易 DP 的。
35 HDU 1005
考虑区间 \([l,r]\) 的笛卡尔树内的区间哪些不在全局笛卡尔树区间里,发现只有左右链,也就是前后缀最小值。
我们知道单调栈可以建成树,那么询问类似于一个链 \(\max\),直接做即可。数据菜了直接跳前后缀最小值也过了。
36 QOJ11116
询问次数比 \(O(n \log n)\) 要小,考虑每次删直径。随机树直径长度 \(O(\sqrt n)\) 所以期望次数 \(O(n \log \log n)\)。先以 \(1\) 为根求出每个点到跟距离,对于目前集合 \(S\),按照到跟距离排序,就可以求出一条距离最上面的点最长的路径 \(u,v\),对于其他点查询 \(dis(v,w)\) 就可以确定其在这条链的哪个位置上挂着然后递归即可。
37 QOJ11115
刻画一个诱导子图连通且补集的诱导子图连通的方式是考虑圆方树,那么可能的集合 \(S\) 有两种:
- 圆方树上某棵子树。
- 某个方点的邻居的一个子集,要求他们在这个点双中连通。
先判定前者。圆点权值为 \(1\) 方点权值为 \(0\),如果存在一棵子树权值和模 \(3\) 余 \(2\) 则直接判定有解,否则所有子树权值和模 \(3\) 余 \(0\) 或 \(1\)。
接下来判定第二个。枚举一个方点,考虑其所有邻居点权和模 \(3\) 余 \(0\) 或 \(1\),如果恰有一个模 \(3\) 余 \(1\) 显然这个点上无解,否则总和模 \(3\) 余 \(1\) 所以至少四个模 \(3\) 余 \(1\) 子树。这等价于一个点双,每个点有权值 \(0\) 或 \(1\),其中至少有 \(4\) 个 \(1\),问是否存在一个连通子图并且其补也连通满足点权和都模 \(3\) 余 \(2\)。我们可以说明一定有解。找出两个 \(1\) 做双极定向得到一个任意前后缀连通的排列,显然存在前缀模 \(3\) 余 \(2\)。
复杂度线性。
38 QOJ7877
先忽略 \(k,l\) 大小关系的限制,那么一个 \(k\) 对应的合法 \(l\) 是一个前缀。考虑判定 \((k,l)\) 是否合法。\(a_{i}+a_{i+2k}=2a_{i+k}\) 可以用字符串哈希看作 \(h(1,l-2k)+h(2k+1,l)=2h(k+1,l-k)\)。对于每个 \(k\) 二分前缀即可做到 \(O(n \log n)\)。
进一步按照 \(k\) 从小到大枚举并从现在最靠后的位置开始枚举即可做到线性。
39 QOJ18299
二分 \(k\) 然后从前往后贪心用数据结构维护没准是可行的,但是过于麻烦。考虑直接刻画合法的充要条件。
首先容易发现必要条件:对于任意区间 \([l,r]\),区间内相邻的间隔差 \(s \leq (r-l+1)k\)。猜测其是充要条件可以发现确实是就过了。
40 QOJ18300
首先有解至少要满足区间 \(0\) 连续段最大值大于等于 \(x\),\(1\) 连续段最大值大于等于 \(y\)。
\(x=0\) 或 \(y=0\) 特殊考虑。否则我们找到最靠左与右的,\(0\) 连续段大于等于 \(x\),以及 \(1\) 连续段大于等于 \(y\)。分别从这些段出发向左右找第一个满足另一个条件的颜色不同的段即可。不难说明这样不会遗漏解。
41 QOJ18301
考虑从下往上使用数据结构维护 DP,关键是横向移动如何处理。
我们从下往上的顺序是,先加入这行的新点,然后对这行的区间做区间加,然后考虑用 \(c_i\) 进行横向移动。考虑这些横向移动的起点,可以发现最优策略必然满足这些起点是这次进行区间加的 \([l,r]\) 的 \(l-1\) 和 \(r+1\) 构成的集合,否则完全可以在上一次就移动到这里,花费更小。
然后考虑这些点向左右更新形如 \(f_x + c_i|y-x|\rightarrow f_y\),可以说明左右更新的都是一个前缀段,直接二分即可,线段树维护区间加,区间覆盖等差数列。复杂度 \(O(n \log^2 n)\) 或 \(O(n \log n)\),取决于是否在线段树上二分。
42 QOJ18338
做法挺多,考虑一个比较简单的做法。
考虑把 \(u,v\) 路径拉平,其他点挂在路径上构成若干子树,新的直径的结构容易分讨,要么是某个子树内直径,要么是最大子树深度和次大子树深度之和。原问题以 \(1\) 为根用树剖解决这个问题即可。
43 NFLS CSP-S 模拟赛 T3
题意:
给定无向简单三部图 \(G\) 和其一个三染色,给每条边染色 \(0\) 或 \(1\) 或 \(2\),定义一个点的点权为邻边权值和模 \(3\),试求一组方案使得任意一条边两端点的点权不同或报告无解。\(1 \leq n,m \leq 2 \times 10^5\)。
解法:
不失一般性假设图连通。也就是考虑每个连通块。如果图恰有两个点显然无解,否则我们声称一定有解。
如果图有奇环,取一个在奇环上的点 \(r\) 作为根考虑一棵 DFS 生成树,钦定每个点的点权就是给定三染色的颜色,将所有非树边权值全都设为 \(0\) 然后从下往上调整。显然任何有父亲的点都可以调整至目标点权,除了根。注意到 \(r\) 在一个奇环上,对一个奇环上的边依次加 \(1,2,1,2,\cdots\),只有一个点的点权发生变化,其改变为 \(+2\),所以可以这样操作以调整根的点权。
如果图是二分图,任取一个度数大于等于 \(2\) 的根 \(r\) 做相同操作,每个点的点权钦定为其深度奇偶性。此时可以发现如果根的点权是 \(2\) 直接合法,否则选其两个儿子的边各加 \(1\) 即可。
44 QOJ11112
考虑如果每个位置出现次数不超过 \(c\),最多能填多少行。显然有一个上界是 \(\lfloor \dfrac{cn}{k}\rfloor\),我们声称一定可以构造到上界。
构造方式是,如果两个串循环移位可以相同,也就是最小表示法相同,则我们称这两个串等价,注意到将一个等价类全部填入对每个位造成的贡献是一样的,所以不断填入若干等价类直至无法填入。考虑将 \(111\cdots100\cdots 0\) 这个等价类留下来就可以解决剩下的了。
45 QOJ18339
将 \(3\) 看为 \(-1\),我们声称一个长度为 \(n\),总和为 \(s\) 的串可以被完全删完当且仅当:
- \(s \geq 0\)。
- \(s \equiv 0 \pmod 4\)。
必要性显然,充分性归纳。然后 DP 即可。
46 QOJ18337
一个网格能被表示出当且仅当不存在一个白格子满足其上和右都有黑格。
注意到给定矩形长度相同,并且两个矩形之间大概率独立,除非投影到 \(x\) 轴得到区间相同或者一个右端点等于另一个左端点,这样的东西构成形如 \(i \rightarrow i+k\) 的若干条链,每条链分别解决。称两个矩形等价当且仅当投影到 \(x\) 轴得到区间相同,注意到一个等价类一定是 \(y \leq c\) 端点是 \(10\),\(y > c\) 是 \(01\),这样每个等价类只有关于等价类大小线性种状态,DP 即可。
47 QOJ15432
从小到大枚举区间右端点 \(r\),如果 \(r\) 开始能直接找到增广路就直接增广,否则找到一个最小的 \(l\) 满足存在 \(l\) 到 \(r\) 的交错路并用 \(r\) 替换 \(l\)。
48 QOJ7666
考虑全是连续的怎么做。可以看作每次增加一个无穷小量 \(\epsilon\),显然每次贪心选取最大的,所以会存在一个 \(x\) 使得所有食物的最后一次收益都是 \(x\) 或者这种食物初始值就小于 \(x\) 所以没选,二分 \(x\) 即可,复杂度 \(O(n \log V)\),注意考虑存在 \(\Delta t = 0\) 的情况。
考虑离散的怎么做,只要能做离散的那么枚举离散的总和然后做上述这个就可以做到 \(O(nW \log V)\)。
直接背包复杂度太大了。注意到添加一个食物的转移形如 \(f_j+v_{kx}\rightarrow g_{j+kx}\) 的 \((\max,+)\) 卷积。对每个 \(j \bmod w\) 单独考虑,此时 \(s_k=v_{kx}\) 是有凸性的所以决策点单调,分治维护决策单调性 DP 即可。
总复杂度 \(O(nW \log V)\)。
49 QOJ7669
考虑任意时刻知道的信息是什么。到一个点我们知道的只是上一次来的边,所以我们只能沿着上一次来的边在这个点的邻居上走一圈。如果两个点 \(A,B\) 以及前驱 \(C,D\),分别从这两条边开始在邻居上走一圈无论如何都得到的是相同的信息那么就无法分辨了。
从而维护哈希,\(f_{u,v}\) 表示从 \(u\) 走到 \(v\),在 \(v\) 出发得到的哈希,转移从 \((u,v)\) 边在 \(v\) 的邻边上按顺序枚举下一条边做转移。转移有环但是显然只需要做 \(O(n)\) 次转移即可判定。最后判定需要做个最小表示法。写得好可以做到总复杂度 \(O(n^3)\),多一个 \(n\) 也能过。
50 ARC086C
注意到不同层之间的点一定不会相遇,考虑对每层单独计算有多少种在这层放点的方案使得会存在一个点到根,将答案乘以 \(2^{n+1-c}\) 求和即为答案,\(c\) 是这层的点数。
显然我们只关心这些点构成的虚树。建出虚树,\(f_i\) 表示以 \(i\) 为根的子树内选点使得存在点能到达 \(i\) 且不被消去的方案数。转移枚举哪个子树的点会到 \(i\) 上,其余每棵子树贡献 \(2^s-f_j\),\(s\) 是子树内叶子个数,也就是子树内这层的节点个数。复杂度 \(O(n \log n)\)。
51 ARC072C
这个过程等价于,初始值 \(x=D\),每次遇到 \(y\),有 \(x \gets \begin{cases} x-y && y\leq x\\ y-x && x<y<2x \\ x && y \geq 2x\end{cases}\)。
对于每个前缀可以直接求出结果 \(f_i\) 表示 \(D\) 经过前缀后的结果。考虑判定 \(i\) 点是否可行,由于可以随意更改 \(i\) 处的值所以到 \(i\) 时,\(x \in [0,f_{i-1}]\) 且每个值都可以取到,只需要判定是否存在 \(x \in [0,f_{i-1}]\) 满足以 \(x\) 为初始值,经过 \([i+1,n]\) 后,最终值可以大于 \(0\)。注意到结果并不随着 \(x\) 呈现单调性,所以不能简单解决。有一个无脑方法是从后往前扫维护平衡树直接维护每个 \(x\) 经过后缀函数复合所得结果,加一个点大概可以写成区间平移后加入删除的形式,然而这样过于繁琐。考虑到 \(x\) 在 \(i\) 处取值范围是一个前缀,考虑对每个后缀记录最小的 \(g_i\) 满足以 \(x=g_i\) 为初始值经过后缀 \([i,n]\) 后最终值大于 \(0\)。我们发现 \(g_i\) 可以简单从 \(g_{i+1}\) 推出,分类讨论 \(a_i\) 关于 \(g_{i+1}\) 的关系即可。复杂度线性。
52 ARC085C
【模板】最大权闭合子图。
53 ARC061D
先考虑直接 DP。\(f_{i,j,k,0/1/2}\) 表示现在三人手上还有 \(i,j,k\) 张牌,现在到哪个人出牌。复杂度三次方。
注意到 DP 形式是三维网格路径计数,但是对 \((0,j,k,0)\) 的起点贡献是 \(3^{j+k}\),枚举 \(j,k\),把式子写出来进行一些化简容易知道我们本质要求的是对于所有 \(k\) 计算 \(\sum \limits_{i=0}^{z} \dfrac{1}{3^i}\dbinom{i+k}{k}\)。推导过程考虑先枚举 \(j\),对 \(k\) 而言将式子组合意义拆开只剩下单个组合数项和 \(\dfrac{1}{3^i}\) 即可。
记 \(f(k)=\sum \limits_{i=1}^z \dfrac{1}{3^i} \dbinom{i+k}{k}\),由于 \(\dbinom{i+k}{k}=\dbinom{i+k-1}{k-1}+\dbinom{i+k-1}{k}\),容易写出 \(f(k-1)\rightarrow f(k)\) 的递推式。至此我们在线性复杂度内解决了本题。
53 ARC178D
考虑刻画合法性。首先 \(A\) 是 \(B\) 的子序列,其次令 \(S\) 为不在 \(A\) 中出现的数,考虑 \(S\) 中最大值 \(x\),可以发现 \(B\) 序列中一定先选取某个区间 \(\mathrm{MEX}\) 为 \(x\) 然而删掉 \(x\),否则先删去某个 \(y<x\) 后就再也无法删去 \(y\) 了。所以限制序列中 \([0,x-1]\) 所有数都在 \(x\) 的左侧或都在 \(x\) 的右侧,然后问题递归到一个前缀或后缀与 \(S'=S\setminus \{x\}\)。
刻画子序列考虑先令 \(B=A\) 然后从大到小加入 \(S\) 中的数,每次删去 \(S\) 中的最大值转移,最大值能选的位置构成 \(A\) 中的空格构成的一段区间,\(f_{i,l,r}\) 表示考虑了 \(S\) 中大于等于 \(i\) 的数,下一个数能填在 \([l,r]\) 区间,转移通过差分等手段简单优化,容易做到 \(O(n^3)\)。
54 ARC191D
一看就是分类讨论,令 \(d\) 表示两点最短路,显然答案不小于 \(2d(S,T)\),先考虑什么时候能取到。
注意到如果两个点之间最短路不唯一,那么显然可以取到。如果最短路唯一,进行进一步分类讨论。
注意到如果最短路上除 \(S,T\) 外存在非二度点,那么一个人可以走到这个点后向非最短路的邻居移动一位,这样可以将答案构造到 \(2d(S,T)+2\)。
注意到这个答案不一定优,有可能不存在非二度点,或者存在其他策略构造到 \(2d(S,T)+1\)。另一个策略是找到 \(S,T\) 的次短简单路径 \(d'\),将答案与 \(d+d'\) 取 \(\min\),这个答案显然也可以取到。\(d'\) 的计算方法可以求出最短路树,也可以根据最短路上没有非二度点从而将最短路上非端点都删去再跑一次求得。
还有可能是找到一个度数不小于三的点 \(u\),将答案对 \(2(d(S,u)+d(T,u))+4\) 取 \(\min\),走法是一个人走到 \(u\) 后停在一个邻居,另一个人过来停在另一个邻居,然后分别走回去。
总复杂度 \(O(m)\) 或 \(O(m \log n)\)。
55 ARC117F
断环为链后在前缀和上做差分约束,但是不在这个链上的弧难以表示,注意到答案可以二分,二分后只考虑在链上的弧,有自己的长度限制和补集的长度限制,这样就可以转为差分约束结构。
直接跑 SPFA 肯定过不去,我们考虑这个图的特殊性。不妨令编号从 \(1\) 开始到 \(2n\) 结束,\(0\) 是 \(S_0=0\) 的边界位置,那么连边形如对于所有 \(i \neq 0\) 且 \(i \neq n\),都有 \((i,i+n)\) 之间连权值不同的双向边,而 \(n \rightarrow 0\) 和 \(2n \rightarrow n\) 的边是有向边,另外还有 \(i \rightarrow i-1\) 的边权为 \(0\) 的边,以及 \(0\) 和 \(2n\) 之间的边。注意到考虑拓扑序 \(2n,n,2n-1,n-1,2n-2,n-2,\cdots,n+1,1,0\),大部分边都是从前向后连,而 \(i,i+n\) 之间的无向边在单轮增广时增广两次,那么只有常数条边不在这个增广顺序上,只需要跑常数轮按照这个顺序对最短路做松弛即可。复杂度 \(O(n \log V)\)。
56 ARC177D
所有柱子高度相同,所以将相邻距离不超过 \(H\) 的缩在一起构成若干连通块,然后结构就是建出笛卡尔树容易维护的东西了。
57 ARC202C
注意到 \(\gcd(R_n,R_m)=R_{\gcd(n,m)}\),证明考虑辗转相除的过程。
\(\mathrm{lcm}\) 不好求但 \(\gcd\) 好求的时候考虑 gcd-lcm 容斥。我们有 \(\mathrm{lcm}(S) =\prod \limits_{T \subseteq S, T \neq \varnothing} \gcd(T)^{(-1)^{|T|-1}}\)。这样一来只需要从前往后维 \(f_{x,0/1}\) 表示 \(\gcd(T)=x\),\(|T|\) 大小是奇数还是偶数的情况下,有多少个符合条件的 \(T\) 满足限制。每次加一个数枚举因数,进一步要维护还要对每个 \(x\) 计算所有倍数的 \(f_{y,0/1}\) 的和,这样复杂度是所有数因数和的平方也就是 \(O(n \log^3 n)\),可以轻松通过,更进一步对 \(\gcd\) 做莫比乌斯反演能做到更优。
58 ARC144D
显然我们只需要确定 \(f(0),f(1),\cdots,f(n-1)\)。然后将其看作 \(2^{[n]}\rightarrow \mathbb{N}\) 的映射,对于所有 \(|S| \geq 2\) 的集合令 \(f(S) = \sum \limits_{x \in S} f(\{x\}) - (|S|-1)f(\varnothing)\) 即可,不难说明所有可行方案和这个一一对应。
然后问题就简单了,假设 \(f(0)=m\),限制对于 \(f(1),f(2),\cdots,f(n-1)\) 来说要求就是表示出的所有数都在 \([0,k]\) 范围内,令 \(g(i)=f(i)-k\) 然后枚举其中正数和负数的个数,最终是一个插板的形式,复杂度线性。
59 ARC077D
令原串 \(S=AA\),找出 \(A\) 的最短周期 \(B\),容易知道 \(f(S)=ABAB\)。
由于进行无限次操作,可以只考虑 \(S\) 的左边一半,那么过程等价于初始为 \(S=A\),每次 \(S \gets S + g(S)\),\(g(S)\) 为 \(S\) 的最短周期。
考虑第一次操作后得到了 \(AB\),若 \(|B| \mid |A|\),可以发现无限次操作后 \(S\) 就是 \(ABBBB\cdots BBB\cdots\)。否则可以发现 \(A + B\) 的最短周期就是 \(A\),然后循环成斐波那契结构。在这个结构上从大到小递归即可。复杂度 \(O(|\Sigma|\log r+|S|)\)。
60 HDU 1006
枚举 \(a\) 的前缀,计算其在 \(b\) 中的匹配覆盖到的点数,以及其在 \(c\) 中出现次数。
难点主要在于计算第二个。从前往后对于目前匹配区间 \([l,r]\),找到 \(l'\) 最大的匹配区间 \([l',r']\),满足 \(l < l' \leq r\) 或者断言没有,此时找到最小的 \(l' > r\),显然这样跳的次数是调和级数的。为了快速找到这样的位置,先求后缀数组,然后并查集维护即可。
61 HDU 1009
基环树的情况是好做的,考虑排列。
注意到一个长度为偶数的环进行一轮操作后会分裂为两个大小一半的环,所以先模拟 \(O(\log n)\) 轮操作直至所有环都是奇数。此时所有限制形如 \(2^k \equiv a \pmod b\),类似 excrt 合并即可。
62 HDU1011
点分树板子。
63 HDU 1007
轨迹总是一些 \(45\) 度直线,用数据结构维护添加直线和求斜率 \(+1,-1\) 之间的直线的交。
64 ARC199D
先考虑判定一个矩形的合法性。显然合法当且仅当对于棋盘上一个处于 \((i,j)\) 位置的 \(1\),要么 \(a_{i,1},a_{i,2},\cdots,a_{i,j-1}\) 都为 \(1\),或者 \(a_{1,j},a_{2,j},\cdots,a_{i-1,j}\) 都为 \(1\)。也就是要求其上面或左边全都是 \(1\)。
先思考能不能对答案直接写出 DP。记 \(f_{n,m}\) 表示合法棋盘个数,\(g_{n,m}\) 表示合法棋盘内 \(1\) 的个数之和。考虑如何转移。
我们枚举第一行的极长前缀 \(1\) 长度 \(l\),那么后面 \(m-l-1\) 个空位若填 \(1\),则这一整列都会填 \(1\) 并且这一列之后不影响答案,可以直接删去。枚举 \(c\) 表示后面 \(m-l-1\) 个里填了 \(c\) 个,从 \(f_{n-1,m-c}\) 转移。
这个转移容易拆式子优化到 \(O(nm\min(n,m))=O(nm\sqrt {nm})\),可以通过。
65 ARC207D
可以猜到我们只要保留中间 \(O(1) \times O(1)\) 的矩形判定博弈结果,每次删去第一行和最后一行,直至矩形行数不超过 \(O(1)\),列同理。然后做 \(O(n^4)\) 的区间 DP 即可。取阈值为 \(5\) 可以通过。
66 AGC044E
我们有转移 \(f_{i}=\max(a_i,\dfrac{f_{i-1}+f_{i+1}}{2}-b_i)\)。如果 \(b_i=0\),可以看出 \((i,f_i)\) 是凸包,并且 \(a\) 的最大值处总有 \(f_i=a_i\),从这个点断开环并在末尾补一个 \(a_i\) 即可转化为序列问题。求出 \(f_i=a_i\) 构成的上凸包,每个点最终值就是向上在凸包上的投影的 \(y\) 坐标。
\(b_i \neq 0\) 时,令序列 \(w_i\) 满足 \(w_i = b_i + \dfrac{w_{i-1}+w_{i+1}}{2}\),由于 \(1,n+1\) 处 \(f\) 不会改变可以随意取 \(w\),然后解出中间所有 \(w\)。令 \(g_i=f_i+w_i\),容易发现 \(g_i = \max(a_i+w_i, \dfrac{g_{i-1}+g_{i+1}}{2})\),套用 \(b_i=0\) 求解即可。
67 P9997
离线对询问串先建出 AC 自动机。注意到询问串长全部相等所以所有本质不同字符串在 Trie 上都是叶子。
对树重剖,考虑如何处理查询。对于串 \(s\) 在路径上的出现分为两类,一类是某个重链内,另一类是横跨至少两条重链。前者对每条重链处理出每个前缀匹配到 AC 自动机上的点即将问题转化为查询树上一条路径上某个值出现次数,带修,对每种值维护 DFN 序上线段树,或者离线下来做即可。后者考虑每条重链把前后 \(x\) 个字符拉出来跑,只有 \(O(x\log n)\) 个,总复杂度 \(O(qx \log n)\)。修改直接在重链上取出修改部分和之后 \(O(l)\) 个位置拉出来修改。由于除了 LCA 的重链之外所有重链修改部分都是前缀所以总修改量 \(O(x)\),总复杂度 \(O(qx \log n)\)。
68 AGC047C
模数 \(P=2\times 10^5+3\) 最小原根 \(g=2\),将 \(a_i\) 写成 \(g^{b_i}\),那么 \(a_i \times a_j \equiv g^{b_i+b_j} \pmod p\),FFT 计算每个 \(a_i+a_j\) 的结果的个数即可。复杂度 \(O(n \log n)\)。
69 HDU 1011
对每个点维护 \(l_i,r_i\),初始 \(l_i=r_i=a_i\),每次是区间推平一个等差数列形式,线段树维护即可。
70 ARC147E
根据 Hall 定理将等价条件描述为若干次区间加或减 \(1\) 后全局所有数非负。
然后问题变为有若干区间 \([l_i,r_i]\) 和若干限制 \(x_i,k_i\),你要选出尽量多的区间,每个限制要求选的区间中包含 \(x_i\) 的不超过 \(k_i\) 个。从左到右扫所有限制点,维护包含目前限制点的区间的右端点集合,每次移动删去右端点小于新限制点的,加入左端点等于新限制点的,只要集合大小大于 \(k_i\) 就不断删除集合中的最大值即可。
71 ARC146C
枚举集合大小,考虑新增一个数的限制即为不存在之前一个奇数大小子集异或和新增数相同,而容易说明之前的集合任意两个奇数大小子集异或和两两不同,所以贡献容易计算。
72 ARC141E
注意到只需要划分为若干链,那么连边就是链 \(a,b\) 之间 \(x \rightarrow x+d\) 连边,下标 \(\bmod n\) 考虑,对于加边 \((a,b,d)\) 可以合并 \(b\) 到 \(a\) 上,权值为 \(d\),并不再考虑 \(b\) 这条链,维护带权并查集即可。连自环时,\(w_i \gets \gcd(w_i,d)\)。
73 ARC137E
先建一条链,一次操作 \(i\) 对应三个参数 \(l,r,c\) 视为 \(S \rightarrow i\),\(i \rightarrow l\),\(r \rightarrow i'\),\(i \rightarrow i'\),\(i' \rightarrow T\) 的若干条边,表示可以从 \(l\) 开始走到 \(r\) 回来,费用不难设计。此时最大费用最大流即为答案,尽管可能存在 \(i\) 的操作从 \(l\) 出发没有从 \(r\) 回来,但由于满流所以限制区间的端点互换并不影响。需要使用原始对偶计算答案,复杂度 \(O((n+m)^2 \log (n+m))\)。
74 ARC132E
我们首先对每个点计算其两侧的操作都不会覆盖到这个点的概率。记左侧有 \(x\) 个洞,右侧有 \(y\) 个,显然两侧独立,答案就是 \(f_xf_y\)。
显然有 \(f_n = (1-\dfrac{1}{2n})f_{n-1}\),含义是有 \(\dfrac{1}{2n}\) 的概率操作了最靠边的且覆盖到了目标位置,其余情况都变为 \(n-1\) 的子问题。
现在还需要考虑一个点被覆盖成向左的概率。直接做可以 DP,\(g_{i,j}\) 表示左侧 \(i\) 个右侧 \(j\) 个,最终覆盖为向左的概率,可以 \(O(1)\) 转移,复杂度 \(O(n^2)\)。
进一步,注意到如果只考虑所有洞,那么最终形态一定形如 <<<>>>>>,也就是一个前缀全是 <,一个后缀全是 >,体现到原字符串上就是至多有一个段内的不变,枚举这个段在哪里,只用 \(f\) 就可以计算答案而不需要 \(g\),从而复杂度线性。
75 ARC125E
有很显然的最大流模型,也很显然转化为最小割,然后就做完了。
76 ARC118D
取原根 \(g\),考虑将模 \(p\) 整数乘法群改为原根意义下的加法群,那么原先的 \([1,p-1]\) 映射到 \([0,p-2]\),\(a,b\) 分别对应离散对数 \(\operatorname{ind} a,\operatorname{ind} b\)。下文的 \(a,b\) 都默认为离散对数。
问题等价于 \([0,p-2]\) 共 \(p-1\) 个点,对于所有 \(i\) 存在边 \((i,i+a),(i,i+b)\),下标模 \(p-1\) 意义理解,问是否存在哈密顿圈。
显然有解的必要条件是 \(\gcd(a,b,p-1)=1\),接下来我们说明 \(p>3\) 时这是充要条件。我们给出构造性证明。
首先,若 \(\gcd(a,p-1)=1\) 或 \(\gcd(b,p-1)=1\),直接在环上走即可。接下来考虑 \(\gcd(a,p-1)>1\) 的情况。不失一般性地假设 \(a\) 的生成子群大小至少为 \(3\),否则交换 \(a,b\)。若 \(a,b\) 生成子群大小均不超过 \(2\) 显然无解。
令 \(d=\gcd(a,p-1)\),有 \(\gcd(b,d)=1\)。令 \(C_x = \{xb,xb+a,xb+2a,\cdots,xb+\left(\dfrac{p-1}{d}-1\right)a\}\),所有数按模 \(p-1\) 意义理解,首尾相连相邻连边,那么 \(C_0,C_1,\cdots,C_{d-1}\) 构成 \([0,p-2]\) 的 \(d\) 个环划分。
对于每个 \(i<d-1\),如果 \(i\) 是偶数,令 \(C_i,C_{i+1}\) 的前两个数分别为 \((a,b),(c,d)\),断开边 \((a,b),(c,d)\),加入边 \((a,c),(b,d)\),如果是偶数,\(a,b,c,d\) 分别是 \(C_i,C_{i+1}\) 的第二个和第三个数。不难验证进行所有操作后得到的图是一个哈密顿圈。
实际求解时不需要显式求出原根,直接用原来的 \(a,b\) 构造即可。
77 ARC121E
考虑排列的逆,那么限制等价于 \(a_i\) 不能严格在 \(i\) 的子树内。
对此容斥,\(f_{i,j}\) 表示以 \(i\) 为根的子树钦定了 \(j\) 个点满足其 \(p\) 在其子树内即可。复杂度 \(O(n^2)\)。
78 ARC121F
每次删掉一个叶子,如果这个叶子是 \(0\) 显然应该直接操作,如果是 \(1\) 且父亲边是按位或则必定胜利,否则如果是 \(1\) 且父亲边是按位与也应该立即操作。从而 DP,记每个子树是否出现过 \(1\) 和父亲边是或,以及不断合并最终的结果即可。复杂度线性。
79 ARC118E
容斥,将不经过改为钦定若干经过,然后就变为一个简单 DP 了。
80 校内 NOIP 模拟赛 T3
注意到一个区间删掉一个 \(c\) 后,所有新区间 \([l,r]\) 形如 \(c_{l-1},c_{r+1}\) 相同且是某种颜色的相邻两个,或者 \(c_{l-1}\) 是 \([1,r]\) 中 \(c_{l-1}\) 最后一次出现,或者相对的 \(c_{r+1}\) 是 \([l,n]\) 中第一次出现。
总共只有 \(O(nV)\) 个这样的区间,所以容易做到 \(O(nV^2)\)。
81 校内 NOIP 模拟赛 T4
考虑只有 \(O(n)\) 个状态会走第一种转移,形如目前处于状态 \(i\),\(x=a_i\)。对这样的状态走一步后求出下一次碰到这样的状态在哪里,容易做到 \(O(n^2)\)。在基环树上进行分讨即可做到正确的复杂度。
82 ARC110E
将 ABC 看作 \(1,2,3\),每次选择相邻两个不同的并将他们改为两者的异或。
特判初始时所有数相等,此时答案为 \(1\),现在考虑怎么判定 \(s\) 能否变为 \(t\)。
我们声称 \(s\) 从前往后每次找最短的区间使得异或和等于 \(t\) 这一位的值匹配即可。合法当且仅当匹配过程中没有匹配出边界最后剩下的后缀异或和为 \(0\)。证明考虑先说明任意一个序列都可以操作为长度为 \(1\) 的序列,权值为异或和,除了初始长度为奇数大于 \(1\) 的且所有数相同的序列,这是容易归纳的。那么进一步可以知道匹配的每一段都不可能是长度为奇数大于 \(1\) 全相同否则应该匹配更短的,而后缀由于异或和为 \(0\) 一定可以放到最后一个 \(t_m\) 里一起,所以容易证明这是充分条件,另一方面必要条件也容易说明。
从前往后 DP,\(f_i\) 表示有多少个 \(t\) 能恰好匹配到 \(i\) 即可,复杂度线性。
83 ARC105E
我们发现如果连边不合并连通块,则这种边相当于一个对后续没有影响的操作,我们不妨假设前若干次双方都会合并连通块,直至合并出图中只剩分别包含 \(1,n\) 的两个连通块,设包含 \(1\) 连通块大小为 \(s\),则还剩 \(s(n-s)-m\) 条边,双方轮流选择,获胜条件取决于这个值的奇偶性,先手想胜利需要取到一个特定奇偶性的 \(s\)。
合并过程只关注每个连通块大小奇偶性,除去 \(1,n\) 两个连通块后,对其他连通块操作可以是:
- 删去一个连通块。
- 合并两个连通块。
- 将一个连通块和 \(1\) 合并。
判定先手是否可以最终令 \(1\) 所在连通块取到特定奇偶性。
我们只关心每种奇偶性连通块大小有多少个,\(f_{a,b,0/1}\) 可以描述获胜情况,复杂度 \(O(n^2)\),这个 DP 是不必要的,把结果打出来可以发现很简单的规律,复杂度线性。
84 ARC102C
对固定的 \(i\),考虑 \(i\) 是否为偶数,如果是偶数限制 \(\dfrac{i}{2}\) 至多选一个,否则没有这个限制。
除去这个限制外,考虑所有 \(a+b = i\) 的二元对,彼此不交,每个限制 \(c_a\times c_b=0\),我们枚举有 \(j\) 个二元对 \((a,b)\) 满足 \(c_a + c_b \neq 0\),也就是 \(a\) 或 \(b\) 选了,并钦定其余二元对 \(c_a+c_b=0\),贡献有个系数 \(2^j\) 表示每个选了的二元对其实是选的 \(a\) 还是 \(b\),还有一个 \(\dbinom{w}{j}\),\(w\) 是总二元对个数。对于不在任何二元对里的数没有额外限制,然后问题变为 \(x_1+x_2+\cdots + x_m=n\) 的序列个数,有若干数要求 \(\geq 1\),也就是 \(j\) 个二元对的值,其他的 \(\geq 0\),简单插板即可。直接实现就是 \(O(n^2)\),不需要容斥或 DP。
85 ARC096C
想法显然是容斥,选择若干颜色要求其出现次数 \(\leq 1\),枚举 \(c\),先有系数 \(\dbinom{n}{c}\) 表示选出 \(c\) 种颜色,然后考虑包含这 \(c\) 种颜色的集合个数 \(i\),那么相当于将 \(c\) 种不同的颜色分到 \(i\) 个内部外部均无序的集合内,但是和一般第二类斯特林数不同的是,这里可以存在颜色直接被扔掉,也就是出现次数为 \(0\)。这个方案数类似第二类斯特林数可以直接平方复杂度递推。\(i\) 个集合内,每个集合在 \(n-c\) 外面都可以随便取,有 \(2^{n-c}\) 种,那么总共就是 \(({2^{n-c}})^{i}=2^{(n-c)i}\) 的贡献。而不包含 \(c\) 种颜色任意一种的集合随便取,有 \(2^{(2^{n-c})}\) 种。总复杂度 \(O(n^2)\) 或 \(O(n^2 \log n)\)。
86 ARC128D
首先保留的肯定是原序列的一个子序列,先考虑判定一个序列能否删掉除去两端的所有。
我们有结论,如果长度为 \(3\) 必定行,否则可行当且仅当序列有至少三种不同的数且没有相邻两个数相同,对此 DP 即可。证明考虑归纳。
87 ARC139C
答案有上界 \(\min(3n+m-3,3m+n-3)\)。
在 \(n \neq m\) 或 \(n\) 是奇数时,一个可以取到的构造形如每次覆盖一个三乘以三,然后最后那一行向右填两个继续到下面,最后一行后缀全填满。
\(n = m\) 且 \(n\) 是偶数时这样只能构造到 \(4n-4\),可以说明此时答案就是这个。
88 HDU 1010
我们考虑将同色连续段合起来,每次操作是选择两个相邻且权值不都为 \(1\) 的段,将两个都减 \(1\),并删去 \(0\) 后合并左右两个。整个过程中 \(0\) 和 \(1\) 的数量差不变,考虑一个序列能最终变为一个 \(0\) 或 \(1\) 的充要条件,可以说明长度足够大时,只要满足数量差是对的,且不是交替串即可。对原序列可以直接 DP 做这个判定。
89 HDU 1005
二项式反演,钦定若干个三元环,那么每个连通块中钦定的三元环只有三角形,\(K_4\),或者两个共边三角形。对此 DP 即可。
90 ARC160F
显然是转 \(01\) 序列,初始全 \(0\),第 \(i\) 次将 \(i\) 出现的位置从 \(0\) 变 \(1\),要求任意时刻按照排序规则都可以排好序。这可以 \(O(n2^n)\) DP 解决,但是每次会加入一个操作会导致总复杂度不对。
考虑一个操作 \((x,y)\),当前仅当现在存在一个 \(01\) 串满足 \(c_x=1,c_y=0\) 时操作才有意义。将所有有意义的操作记录下来,修改时如果是无意义的直接跳过,否则重构,不难发现重构后有意义的操作数量严格变小,所以总复杂度 \(O(n^32^n)\) 或 \(O(n^42^n)\),可以通过。
91 ARC161F
考虑判定是否存在子图密度严格大于 \(D\),只需要将边权值看作 \(+1\),点看作 \(-D\),每条边和点都看作点,每条边连向其两个端点,转化为经典的最大权闭合子图,使用网路流可以在 \(O(m\sqrt m)\) 的复杂度内判定是否存在子图密度大于 \(D\)。
然而若不存在,也依然可能存在真子图密度等于 \(D\),而网络流找出的解有可能是整个点集的导出子图不是真子图。
考虑网络流求出的一组流,左右侧每个点都满流,意味着每条边匹配了一个端点,且每个点被匹配恰好 \(D\) 次。将匹配看作边定向,那么我们得到了一个原图的边定向,使得每个点的入度均为 \(D\)。考虑这个有向图,可以发现任意一个闭合子图的密度都是 \(D\),所以如果整个图不是强连通的则导出存在真子图密度为 \(D\),否则是强连通时我们断言一定不存在真子图密度为 \(D\),若存在考虑这个子图在任何定向方案中都一定是闭合子图,从而和求出方案是强连通的矛盾。
综上跑一次网络流后再跑一次缩点即可。复杂度 \(O((ND)^{1.5})\)。
92 ARC165D
我们钦定 \(S_{A_i} < S_{C_i}\),建图如果是 DAG 就一定有解,否则每个 SCC 内的点对应的字符都相同,然后再考虑每个限制,再加上 \(A_i+1\) 和 \(C_i+1\) 之间的限制,以此类推不断向后直至存在某个限制的某一端区间目前位置超出右端点就可以做出判定。每次缩点都会出现新的 SCC 否则立即导出有解,所以总复杂度 \(O(n^2)\)。
93 QOJ18997
显然子树内点权和大于等于一半的点构成从根出发的一条链,我们的目标是找到链上的最后一个点。
由于子树权值至少为一半所以每次随机一个位置有一半的概率在子树内,这启发我们随机 \(O(\log V)\) 次,按照 \(w\) 带权随机,每次随机到点 \(u\) 找到其最深的祖先满足子树点权和至少为一半。
然而实质上我们不需要这么做。注意到每次修改将 \(x\) 的父亲改为 \(z\),设上一次答案 \(y\),那么 \(x\) 或者 \(y\) 一定在答案的子树内。现在只需要解决上述问题。
二分一个祖先,查询其子树内点权和。现在要解决两个问题,第一是怎么求一个点的 \(k\) 级祖先,第二是怎么求一个点的子树点权和。一个想法是弹飞绵羊状物,不够优秀,可能可以 LCT 但我不会,剩下的能维护动态树的简单结构一般就是平衡树维护树的某种序列,其中括号序是相当方便同时刻画深度信息和子树信息的,DFS 到一个点写下 \(+1\),离开写下 \(-1\),一个点的前缀和就是深度,子树就是对应两次写下之间的所有点,动态修改父亲只需要将子树 split 出来插入在离开新父亲写下的 \(-1\) 之前,查询就是简单的区间和,计算 \(u\) 的 \(k\) 级祖先时先求前缀和计算 \(u\) 的深度,从而计算 \(k\) 级祖先的深度,然后找到 \(1\) 到 \(u\) 第二次出现这段前缀内最后一个位置满足前缀和恰为 \(k\) 级祖先的深度,这是容易平衡树上二分的,那么可以发现 \(k\) 级祖先要么是这个点要么是这个点的父亲。综上使用两棵平衡树分别维护点权和以及 \(k\) 级祖先即可。总复杂度 \(O(n \log n + q \log^2 n)\)。
94 QOJ18998
注意到由于存在深度信息所以每个点的父亲是可以简单计算得来的。在 DFS 树上的非树边只能是反祖边,枚举反祖边上较上的点也就是祖先那个点,限制很容易做,需要使用数据结构维护,复杂度 \(O(n \log n)\)。
95 QOJ9161
我们可以发现从任意时刻开始,第一次发生碰撞的一定是对应方向排序后相邻的,其中方向有 \(x,y,x+y,y-x\) 四种。
维护这若干种排序结果,将下次碰撞时间加入 set 里,每次进行一次碰撞时删掉对应的位置,加入排序中前驱后继即可。复杂度 \(O(n \log n)\)。
96 QOJ9162
一个最简单的想法是直接 DP。\(f_{i,0/1}\) 表示 \(i\) 个人,\(0\) 表示不预先知道任何信息,\(1\) 表示已知至少一个人阳性时,最终总次数的期望最小值。转移枚举进行 \(j\) 个人的测试,根据其中是否为阳性进行下一步转移,\(f_{i,1}\) 的计算中确定其中是否为阳性的概率只需计算其条件概率 \(P(A\mid B)=\dfrac{P(AB)}{P(B)}\)。还原答案只需要记录转移顺序。
这个做法看似很优,但写出来可以发现其比满分限制稍大,考虑为什么不优。
我们显然知道 \(f_{i,0} \leq f_{j,0}+f_{i-j,0}\),在上述过程中,确定一个集合里有 \(1\) 后,当我们找到了其中的某个 \(1\) 时,这个集合内 \(1\) 之前的前缀与曾经这个集合外的所有人的状态相同,都是不预先知道任何信息,而我们的 DP 却把他们分开了,导致次数偏大。于是我们考虑每次只求出最靠后的一个 \(1\),并将 \(1\) 之前的前缀作为整体继续处理而不是通过上述 DP 过程自然将他们拆开。
于是重新定义 \(f_{i,0/1}\) 表示求出最后一个 \(1\) 或者确定没有 \(1\) 的期望次数最小值,每次枚举询问的后缀长度进行转移。实际操作时维护一个前缀按照 DP 路径求出最后一个 \(1\),然后将前缀改为这个 \(1\) 之前的所有位置即可。这样实际测试可以做到满分限制内。
97 P15241
类似线段树分治,从根向下传边集,一个做法是使用 LCT 维护加边求最小生成树,我不会。考虑每轮得到上面传下来的边集后,怎么向下传才能保证复杂度。
首先删去和目前区间没有交的,暴力下传和当前区间部分有交的。现在考虑完全包含目前区间的如何下传。
将所有和当前区间部分有交的区间的边权设为 \(0\) 先加入,然后再加入完全包含目前区间的求出 MST,这些完全包含区间的边一定在区间内任意时刻都处于 MST 上。现在将并查集清空,将这些必定成为 MST 的边加入,然后将其余所有包含目前区间的边加入再求一次 MST,将 MST 上的边都向下传。我们可以说明这样的复杂度是 \(O(m \alpha(n) \log n)\)。显然我们只需要说明向下传的包含区间的边的数量级是对的。而注意到所有这样的边会在第二次 MST 内而不是在第一次 MST 内就说明第一次存在一种和目前区间部分有交的区间对应边合并了这两个连通块,所以这样向下传的边的数量不多于和目前区间部分有交的区间,总复杂度和一般线段树分治相同。
98 P15316
通过等式 \(x= \sum \limits_{i=1}^x 1\) 将 \(\min \limits_{i=l}^r a_i\) 转化为枚举一个 \(i\),要求区间所有数大于等于 \(i\),贡献也就是按值域 \(i\) 从 \(1\) 到 \(+\infty\) 扫描,任意时刻将序列转为 \(01\) 后,所有极长 \(01\) 段的 \(w\) 子区间和的总和。要求 \(\sum \limits_{i=1}^n a_i=x\) 即要求所有时刻 \(1\) 的个数和为 \(x\)。
我们考虑每个区间 \([l,r]\) 记 \(s_{l,r}\) 为子区间 \(w\) 之和。由于 \(s\) 是子区间和其自然满足四边形不等式,我们将问题转化为,每个区间 \([l,r]\) 价值 \(s_{l,r}\) 重量 \(r-l+1\),可以取任意多个,背包总容量限制 \(x\),求最大价值和。由于满足四边形不等式,这样求出最优解必然对应原问题的一组解。
对于这样的背包,我们有结论:当容量 \(x > n^2\) 时,可以不断贪心地取性价比最高的物品直至 \(x \leq n^2\)。证明考虑性价比最高的物品重量 \(i\),价值 \(v_i\)。对于选取的任何其他物品,只要存在一个子集的重量和是 \(i\) 的倍数,就可以将这个子集改为选若干个物品 \(i\)。而显然有一个很松的上界是至多选 \(n\) 个其他物品,否则写成序列后物品价值前缀和模 \(i\) 存在相同的,从而存在子集重量和为 \(i\) 的倍数。由于所有物品重量不超过 \(n\),这个阈值即为 \(n^2\)。
那么只需要做 \(x=O(n^2)\) 的背包,总复杂度 \(O(n^3)\)。
99 P15244
枚举 \(k\) 从小到大做 DP。\(f_i = \max \limits_{j < i} \{g_j+w(j+1,i)\}\)。这个式子可能存在四边形不等式但是这不重要,我们直接对 \(i\) 扫描线对每个 \(j\) 维护 \(g_j+w(j+1,i)\) 即可。具体来说用线段树维护之,先将值域离散化,可以发现 \(i\) 处新增区间 \([l_i,r_i]\) 等价于将 \([l_i,r_i]\) 的最后一次出现位置覆盖为 \(i\),并分别将 \([1,i]\) 的一段后缀加 \(1\)。颜色段均摊维护即可。总复杂度 \(O(kn \log n)\)。
100 P15315
对于类似这种一个区间合法任意子区间也合法的最小划分结构,容易知道最优策略是每次取一个最长的可行前缀删掉。现在考虑怎么维护在末尾加入,判定合法性。
误差不超过 \(\varepsilon\) 看作 \(f(x_i)\in[i-\varepsilon,i+\varepsilon]\)。记 \(l_i=i-\varepsilon,r_i=i+\varepsilon\),设一次函数 \(y=kx+b\),那么有 \(kx_i+b \geq l_i\) 以及 \(kx_i+b \leq r_i\),只要符合所有限制即合法。看成 \(b\) 的式子我们有 \(b \geq l_i-kx_i\) 以及 \(b \leq r_i-kx_i\)。确定 \(k\) 后要求 \((l_i-kx_i)_{\max} \leq (r_i-kx_i)_{\min}\)。也就是对于任意 \(i \neq j\) 总有 \(l_i-kx_i \leq r_j - kx_j\),那么有 \(k(x_i-x_j) \geq l_i-r_j\),如果 \(i>j\) 那么我们有 \(k \geq \dfrac{l_i-r_j}{x_i-x_j}\),否则我们有 \(k \leq \dfrac{l_i-r_j}{x_i-x_j}\)。也就是我们要求出满足 \(i>j\) 的最大的 \(\dfrac{l_i-r_j}{x_i-x_j}\) 以及 \(i>j\) 的最小的 \(\dfrac{r_i-l_j}{x_i-x_j}\)。
末尾加入时新的 \(i\) 只有可能为这个位置,要求所有 \(j < i\) 的上述式子的最小最大值,分别看作 \((x_j,r_j)\) 和 \((x_j,l_j)\),相当于询问到 \((x_i,l_i)\) 或 \((x_i,r_i)\) 的斜率的最大和最小值,这样的最优点都在凸包上,查询在凸包上二分即可。复杂度 \(O(n \log n)\)。
101 CF1336D
最直接的想法是,依次加入每个数,如果 \(\sum \dbinom{c_i}{3}\) 增加了,由于 \(\dbinom{x}{3}-\dbinom{x-1}{3}\) 在 \(x \geq 3\) 时单调增加,所以可以确定初始的 \(c_i\)。然而如果结果不变,那么初始的 \(c_i\) 可能为 \(0\) 或 \(1\) 具体不确定。再插入一次可以确定,这样需要 \(2n\) 次询问。
考虑用第二种结果在此时确定是 \(0\) 还是 \(1\),考虑操作 \(i-1\) 时,\([1,i-1]\) 所有数现在都出现至少一次并且次数都确定,那么第二类的增量减去 \(i-3,i-2,i-1\) 对应增量后,就剩下 \(i-2,i-1,i\) 和 \(i-1,i,i+1\) 的增量。如果 \(c_i=0\) 那么增量为 \(0\) 否则不为 \(0\),这样就不需要多一次询问了。
看起来我们已经做到 \(n\) 次了,但实则不然,可以发现边界上,前 \(3\) 到 \(4\) 的位置通过这样的操作无法确定,导致后缀也操作不了,整个做法出现漏洞。其本质原因是,操作 \(1\) 时发现第二类增量为 \(0\),其原因未必是 \(c_2=0\),还有可能是 \(c_3=0\)。
考虑手玩前几个位置,可以发现 \(4\) 次询问可以确定前 \(3\) 个数,我们还知道其实不用询问 \(n\) 因为 \(n-1\) 个数确定后,最后一个数通过两类信息可以唯一确定。这样的话就做到了 \(n\) 次询问。具体分讨比较繁琐,我采用的方法是先问 \(1\),然后问 \(2\),然后问 \(3\),然后问 \(1\),过程中任意一步若可以直接确定则套用之前的算法向后查询后缀即可,否则 \(4\) 次询问求出 \(3\) 个点后从第 \(4\) 个位置开始查询。
102 CF1336E1
我们求出 \(a\) 的线性基,大小 \(w\),可以发现只需要对 \(w\) 个线性基里的数求答案,每个值乘以 \(2^{n-w}\) 即为最终答案,原因是 \(2^{n-w}\) 中每种选法的子集异或都能被线性基内的表示,然后将线性基内目标方案和对应表示异或就构成了双射。
线性基有好处是,最高位依次递减。折半搜索,对高一半位枚举子集求出异或,我们只关心异或值在高一半位的 \(1\) 的个数和异或值在低一半位的具体值,然后和低一半位的子集异或结果做 FWT 即可。复杂度 \(O(m^22^{\frac{m}{2}})\)。
103 CF1336E2
和 E1 不同,我们要求一个复杂度严格 \(O(2^{\frac{m}{2}})\) 的算法。
类似地,只需要对线性基内的数求答案。考虑对线性基的大小 \(\mathrm{rank}(A)=w\) 分类讨论。若 \(w \leq \dfrac{m}{2}\),直接 DFS 搜索所有子集,复杂度 \(O(2^w)=O(2^{\frac{m}{2}})\)。现在,当 \(w > \dfrac{m}{2}\) 时,我们给出一个 \(O(2^{m-w})\) 的算法:
考虑用集合幂级数刻画信息。设 \(a\) 为线性基。我们要求的每种异或的结果的集合幂级数 \(F=\prod (1+x^{a_i})\)。考虑对 \(F\) 进行 FWT,我们有 \(\mathrm{FWT}(F)_{S}=\prod (1+(-1)^{|a_i \cap S|})\)。其值只有两种可能,分别为 \(0\) 或 \(2^{w}\)。其中当且仅当 \(\forall i: 2 \mid |a_i \cap S|\) 时,结果为 \(2^{w}\)。现在我们声称只有 \(2^{m-w}\) 个位置 \(S\) 满足其结果为 \(2^{w}\)。考虑将线性基进行消元,使得所有主元只在其对应行上为 \(1\) 其余都为 \(0\)。这样枚举一个非主元的数构成的子集,我们可以唯一确定主元上每一位是否为 \(1\),这样的枚举量为 \(O(2^{m-w})\)。设这些值非 \(0\) 的 \(S\) 构成的集合为 \(C\)。
接下来考虑求答案,我们要对每个 \(i\) 计算 \(\sum \limits_{|T|=i} F_T = \sum \limits_{|T|=i} \mathrm{IFWT}(\mathrm{FWT}(F))_{T}\)。
将 \(\mathrm{IFWT}(\mathrm{FWT}(F))_T\) 拆开,其等于 \(\dfrac{1}{2^m} \sum \limits_{S} \mathrm{FWT}(F)_{S}(-1)^{|S|\cap |T|}\)。
也就是要计算 \(\dfrac{2^w}{2^m}\sum \limits_{S \in C} \sum \limits_{|T|=i} (-1)^{|S|\cap |T|}\)。显然我们只关心 \(|S|\) 而不关心具体的 \(S\),这是因为 \(T\) 是任取的。枚举 \(|S|\) 以及 \(|S \cap T|\) 计算有多少合法的 \(T\) 即可。这部分复杂度是 \(O(\mathrm{poly}(m))\) 的。
所以总复杂度 \(O(2^{\frac{m}{2}})\),可以通过。
104 P15407
等价于找到一个最深的点满足子树点权和大于等于总和的一半。只要能找到一个点满足其在所求点子树内,那么在祖先链上二分找即可。一个做法是 DFS 序的带权中点必然满足要求,树剖维护链加子树和,复杂度 \(O(n\log^2 n)\)。另一个做法是考虑如果修改在链上,那么以修改的链端点以及之前的答案分别作为这个点计算,否则如果是子树加,要么答案是以前的答案的祖先,要么是子树加对应的这个点的祖先,要么在子树内的不断走重儿子的链上,前两个处理方法和之前相同,重儿子直接在重链上二分。复杂度也是 \(O(n \log^2 n)\)。
105 P13960
考虑 \(s_x\) 是 \(s_i + \mathrm{pre}(t,j)\) 的后缀,要么 \(|s_x| \leq \mathrm{pre}(t,j)\),要么 \(s_x\) 的一个开头部分是 \(s_i\) 的一个 AC 自动机上的 Fail,后面部分恰好为 \(\mathrm{pre}(t,j)\)。
首先对 Trie 建立 AC 自动机,由于值域过大需要用主席树维护出边。求出每个点的 Fail。现在考虑对每个点求出其不断走 \(t\) 的前缀走多少次会不存在向下的边需要跳 Fail。这一步容易二分哈希求出,记其为 \(w_i\)。那么 \(f(i,j)\) 就是 \(i\) 的 Fail 树上最深的祖先 \(x\) 满足 \(w_x \geq j\),或者一开始从 \(0\) 出发直接匹配 \(t\) 的这段前缀得到的位置。按照 \(j\) 从大到小扫描线,每次加入一个 \(x\) 相当于 Fail 树上子树 chkmax,后者从前往后扫记录一下匹配到的点即可计算答案。子树 chkmax 直接使用吉司机线段树。总复杂度 \(O(n \log n)\)。
106 P13954
\(f_{i,j}\) 表示以 \(i\) 为根的子树,\(i\) 到所有叶子的点权和为 \(j\)。容易知道 \(j\) 不超过子树深度。先将所有点的 \(a\) 设为 \(0\),将其改为 \(1\) 有 \(-1\) 或 \(1\) 的代价,最小化代价。转移是 \(f_{i,j}=\sum f_{s,j}\) 然后做形如 \(f_{i,j} \gets f_{i,j-1} \pm 1\) 的 chkmin 转移,所以有凸性。一个做法是直接根据长链剖分,每个点短儿子深度和 \(O(n)\),从而缩二度点以优化复杂度。另一个做法基于凸优化,直接维护 \(f_{i,j}\) 的差分,将短儿子暴力合并,长儿子答案继承即可。复杂度 \(O(n \log n)\)。
107 P14241
来点无脑做法。
将每个区间的贡献放在这个区间的唯一一个 \(1\) 上,动态维护 \(1\) 构成的集合,那么每个 \(i\) 的贡献是,找到前驱后继 \(x,y\),所有 \(l \in (x,i]\) 并且 \(r \in [i,y)\) 的区间产生贡献,主席树维护即可。修改时重新计算修改的点的前驱后继答案即可。复杂度 \(O(n \log n)\)。
108 CF1074F
我们知道给定一个图上的一个起点和一棵生成树,其可以是以这个点为根的 DFS 生成树当且仅当不存在横叉边。
对于每个限制考虑 ban 掉的起点在哪里,容易发现可以用 \(O(1)\) 个 DFN 序区间刻画,维护区间加区间最大值个数即可,复杂度 \(O(n \log n)\)。
109 CF1074D
转成前缀异或,带权并查集维护即可。
110 CF1427F
考虑没有交替选的过程,由于题目保证合法,从前往后扫描维护一个栈,每次栈顶三个相同就弹栈。对于三个匹配的位置,记中间为空,左侧为左括号,右侧为右括号,可以发现我们得到了一棵树的一个括号序,记每个点的颜色表示其被谁拿走,不难发现树上每个点和其父亲的颜色不同,操作过程是双方轮流删叶子。由于保证有解,对于原问题,贪心策略就是每次优先取非根的叶子即可。
111 CF1425I
暴力可以通过,不过这不重要。
初步推定是根号结构,对 \(a\) 根号分治。
若 \(a_i > B\),可以暴力维护。将树拍平成 DFS 序列,对序列分块。每次操作暴力枚举区间内所有位置,然后将这个位置挂在其下一次收获的时间点上。复杂度 \(O(\dfrac{n^2}{B})\)。
\(a_i \leq B\) 时,不同的 \(a_i\) 数量 \(O(B)\),考虑对每一种分别计算。在每个时刻维护一棵线段树,下标为 DFS 序,表示哪些点激活,并维护相关信息。每次将目前这棵线段树的子树区间分裂出来挂在新时间点的线段树上,维护线段树分裂合并即可。复杂度 \(O(nB\log n)\)。可以平衡到 \(O(n\sqrt{n\log n})\)。
112 CF1423C
不妨令 \(k=3\)。
最简单的方法是点分治,具体来说每个点向点分树所有祖先连边,边数 \(O(n \log n)\),无法通过。
注意到 \(k=3\),考虑对这个结构进行优化,上述结构其实满足了 \(k=2\),所以考虑点分治过程中,对目前重心 \(u\) 割开的连通块大小最大的连通块,令其重心 \(w\),这个连通块所有点向 \(w\) 连边,然后 \(w\) 向 \(u\) 连边,断开 \(w\) 后和 \(u\) 相邻的连通块内的点也向 \(u\) 连边,然后递归分治 \(w\) 的不同子树。可以说明这样做满足条件且在题目限制内可以做到不超过 \(10\times n\) 条边,可以通过,不过渐进次数依然是 \(O(n \log n)\)。
渐进次数更优的做法是对树维护 Sqrt Tree,类似序列上的 Sqrt Tree,对树建立 Sqrt Tree 只需要每次对树进行树分块然后递归进入每一块,同时将相邻的块进行连边,这样边数即为 \(O(n \log \log n)\)。具体来说树分块过程中,令 \(B=\sqrt n\),取 \(B\) 个关键点,可以随机取也可以从叶子到根按照子树大小大于 \(B\) 决定是否取,关键点之间两两连边,每个关键点和儿子里对应连通块内所有点连边,每个关键点向其父亲所在连通块内所有点连边,这样一来至多 \(O(\sqrt n)\) 个关键点,每个新连通块大小 \(O(\sqrt n)\),至多连了 \(O(n)\) 条边,总边数和 Sqrt Tree 一样,为 \(O(n \log \log n)\)。
113 CF1422E
我们总是有 \(f_i = \min(s_i+f_{i+1},f_{i+2})\),其中第二项转移要求 \(s_i = s_{i+1}\)。
最简单的做法是考虑每个点 \(i\) 设一个父亲 \(fa_i\) 表示 \(f_i\) 下一个有值的位置,比较直接倍增哈希求出 LCP,复杂度 \(O(n \log n)\)。
进一步地,存在线性做法。为了比较 \(f_{i+2}\) 和 \(s_i+f_{i+1}\),先比较 \(s_i\) 和 \(f_{i+2}\) 的第一项,然后转为比较 \(f_{i+1}\) 和某个 \(f_j\),如果直接维护 \(f\) 的大小关系构成的排列可以平衡树,这样更丑了还不如倍增哈希。注意到如果要选取第一项 \(s_i+f_{i+1}\) 而不是第二项 \(f_{i+2}\),肯定是由于 \(s_i\) 比较小,所以比较 \(s_i+f_{i+1}\) 和 \(f_{i+2}\) 只需要求出 \(g_{j}\) 表示 \(f_j\) 的极长相等字符前缀长度即可转移。复杂度线性。所以实际上若 \(s_i=s_{i+1}\) 时不存在 \(s_i+f_{i+1}\) 的转移,只有 \(s_i+s_i+f_{i+2}\) 的转移。
114 CF1408H
我们很容易发现若答案为 \(b\),我们取出的 \(i,k\) 一定分别是前后 \(b\) 个 \(0\)。
记序列总共有 \(c\) 个 \(0\),答案上界 \(l=\lfloor \dfrac{c}{2} \rfloor\)。考虑前后 \(l\) 个 \(0\),前 \(l\) 个 \(0\) 最后一个为 \(x\),后 \(l\) 个 \(0\) 第一个为 \(y\),对于每种颜色,若存在出现位置在 \((x,y)\) 区间内,则其必定被选而不影响合法性,否则考虑其必定选在左侧最靠右的或者右侧最靠左的,并且选左侧不影响右侧,选右侧不影响左侧。建立网络流模型,前后 \(l\) 个 \(0\) 分别连一条链,\(S\) 向每种颜色连边,每种颜色向前半部分和后半部分都有至多一条边,前后 \(l\) 个 \(0\) 向汇点连边,求最大流即为答案。
最大流即为最小割,注意到割掉的 \(0\) 的边是一段前后缀,扫描线枚举割掉的前缀在哪里即可,复杂度 \(O(n\log n)\)。
115 CF1404D
爆搜可以看出 \(2 \mid n\) 时先手必胜,\(2 \nmid n\) 时后手必胜。
先看 \(2 \mid n\) 如何构造,观察爆搜结果,一组可行构造是,\((1,2),(3,4),\cdots,(n-3,n-2),(n-1,2n-1),(n,2n),(n+1,n+2),(n+3,n+4),\cdots,(2n-3,2n-2)\)。不难说明后手不存在和为 \(2n\) 倍数的选法。
接下来考虑 \(2 \nmid n\),后手如何选出和为 \(2n\) 倍数的集合。注意到所有数总和为 \((1+2n)n\) 模 \(2n\) 余 \(n\),因此后手想要选出和模 \(2n\) 余 \(0\) 的集合只需要选出和模 \(n\) 余 \(0\) 的集合,这个集合的和若模 \(2n\) 余 \(n\) 选取其补集即可。现在考虑点编号 \(0\) 到 \(n-1\),每个 pair 看作一条边,你需要给每条边选取一个端点使得编号和模 \(n\) 余 \(0\)。考虑 \(0\) 到 \(n-1\) 总和模 \(n\),当 \(n\) 是奇数时总和模 \(n\) 余 \(0\)。图上每个点度数为 \(2\) 构成若干个环,每个环上直接按顺时针顺序取数,那么每个点都恰被选一次,总和模 \(n\) 余 \(0\),问题解决。
116 CF1392H
考虑记 \(f_i\) 表示目前还有 \(i\) 张牌没有加入集合 \(S\),到达目标状态的期望次数。枚举这一轮新加入了几张牌,所有曾经加入过的牌都有相同的概率出现在第一张小丑前并额外造成 \(1\) 的贡献,从 \(f_j\) 转移,其中 \(j<i\),如果一张牌都没有新加入集合则相当于一个一元方程,解之即可,复杂度 \(O(n^2)\)。
发现上述做法瓶颈在于要枚举一轮的新增牌数,并且要计算曾经加入过集合的牌的贡献。考虑一张曾经加入过的牌,在之后的过程中,我们视为其不存在,每进行一轮都有 \(\dfrac{1}{m+1}\) 的概率额外造成 \(1\) 的贡献。所以记 \(f_i,g_i\) 分别表示 \(n=i\) 时的答案和期望轮数,每一轮在抽到小丑时结算。先对后者转移,有 \(\dfrac{i}{i+m}\) 的概率抽到一张新的牌,然后从 \(g_{i-1}\) 转移,或者 \(\dfrac{m}{i+m}\) 的概率抽到小丑从自身转移,同理列方程求解即可,即 \(g_i = \dfrac{i}{m+i}\times g_{i-1}+\dfrac{m}{m+i}(g_i+1)\)。然后求解 \(f\),同理要么 \(\dfrac{m}{i+m}\) 的概率抽不到,从 \(f_i+1\) 转移,要么 \(\dfrac{i}{i+m}\) 的概率抽到,从 \(1+f_{i-1}+(g_{i-1}-1)\times \dfrac{1}{m+1}\) 转移,其中 \(g_{i-1}-1\) 的 \(-1\) 意思是这一轮不计入贡献。复杂度线性。
117 CF1396D
枚举上边界,尝试扫描下边界,对每个左边界维护最小的满足条件的右边界 \(r_i\)。
从上往下难以扫描,但是从下往上容易,每次删去一个位置的一个值,找到其后继 \(x\),前驱 \(y\),对于所有 \(i > y\) 以及 \(r_i<x\),都要将 \(r_i\) 重新赋值为 \(x\)。由于 \(r\) 单调不降,直接在线段树上二分即可,细节多,离散化部分需要处理好。复杂度 \(O(n^2 \log n)\)。
118 CF1389G
我们首先说明,对于任意边双连通分量,可以将无向边定向,使得其为一个强连通图。证明考虑边双连通分量对应的耳分解过程,将耳的边按照路径顺序定向即可。
现在将图缩点,只考虑缩点后的边。如果一条边只有一侧有关键点,这条边显然可以定向,将其花费设为 \(0\),否则一条边能定向当且仅当仅存在其一侧有饱和的点。
这意味着,答案就是选取一个包含 \(i\) 的连通块最大化点权和减边权和,换根 DP 即可,复杂度线性。
119 CF1904F
倍增优化建图即可。
120 CF1900F
注意到操作只会进行 \(O(\log n)\) 轮,并且区间相对于全局不同的时每一轮的开头和末尾状态不同,于是先对全局模拟操作,区间询问时进行 \(O(\log n)\) 轮,每轮把两侧的值拉出来模拟即可。
121 CF1895G
不难将问题刻画为网络流模型,将 \(0\) 的位置状态取反,\(r,b\) 交换,这样就变成 \(1,0\) 状态不同需要花费,这是经典的最小割模型,具体地,\(S\) 向每个点连 \(r_i\) 的边,每个点向 \(T\) 连 \(b_i\) 的边,\(10\) 之间从前往后连 \(1\) 的边,最大流即为答案。
由于增广路没有环,所以肯定优先流 \(S \rightarrow i \rightarrow T\) 的边,流量为 \(\min(r_i,b_i)\),接下来每个点 \(r_i=0\) 或 \(b_i=0\),我们只关心 \(1\) 的 \(r_i\) 和 \(0\) 的 \(b_i\),那么新的流等价于每个 \(s_i=1\) 的可以匹配至多 \(r_i\) 次,每次匹配后面一个 \(s_j=0\) 且不能多次匹配同一个 \(j\),每个 \(j\) 最多匹配 \(b_j\) 次。显然按照 \(i\) 从大到小贪心,每次选取 \(b\) 前 \(r_i\) 大的减去 \(1\) 即可,使用平衡树维护即可。复杂度 \(O(n \log n)\)。
122 CF1854D
做法很多。
首先直接二分出 \(1\) 所在内向基环树上环上所有点,可以做到 \(O(n \log n)\) 次询问。然后每个点询问一次 \(k=\infty\) 即可。
注意到前者二分需要次数多,后者需要次数少,考虑平衡。令块长 \(B\),对于环上,先询问开头 \(B\) 个位置,然后每 \(B\) 个位置询问一次,询问次数 \(O(\dfrac{n\log n}{B})\),然后每个点问至多 \(B\) 次,询问次数 \(O(nB)\),取 \(B=\sqrt{\log n}\) 得次数 \(O(n\sqrt{\log n})\)。
然而这个题卡的很紧,需要仔细分析常数。直接这么写无法通过。考虑到交互库不自适应,后者的对每个点查询至多 \(B\) 次可以改为按照随机顺序询问每个点,并且随机询问一个较大的 \(k\) 使得其模 \(B\) 均匀随机,如果这个点是好的则将这个点也加入集合。这样大概可以做到除以 \(2\) 的常数,但是如果环长太小,并且其他点都到不了环上,则这个做法依然需要较大的询问次数,每个点都要卡满 \(B\) 次。
进一步,对环长度分类讨论。注意到如果环长 \(\leq 150\) 左右,则直接每个点二分然后对每个点询问一次就可以通过,所以环长小时直接暴力,否则运行上述算法,取 \(B=4\),可以通过。
123 CF1841F
将式子拆开并化简可以得到一个经典问题:给定若干平面向量,求一个子集使得其和的模长最大。
我们可以说明存在一个最优解使得选取的向量是一条经过原点的直线的一侧的所有向量,极角排序双指针即可,细节很多。
124 CF2003F
一个做法是随机化,将每种颜色随机映射到 \([1,m]\) 的一种并以 \(O(n2^m \log n)\) 的复杂度计算答案,每次有不低于 \(\dfrac{m!}{m^m}\) 的概率算出正确答案,随机 \(T\) 次,复杂度 \(O(Tn2^m\log n)\)。
另存在一个视 \(m\) 为常数的 \(O(n^2)\) 做法,枚举 \(p_3\),左右两边虽然各有 \(O(n^2)\) 个匹配但是只需要保留常数个,也就是最大的 pair 附近的 \(O(1)\) 个,这样是 \(O(n^2)\) 的。
125 CF1975G
不断同时删去开头和结尾的两个,直至开头和结尾都有 \(\texttt{*}\) 通配符。
此时可以说明,如果 \(S,T\) 均存在 \(\texttt{*}\) 通配符,必定可以匹配,分类讨论开头和结尾的 \(\texttt{*}\) 是否同属一侧即可证明。否则考虑只有 \(S\) 含有 \(\texttt{*}\)。
\(\texttt{*}\) 将 \(S\) 分为了若干不包含开头末尾的段,只需要每段在 \(T\) 中找到一个匹配段,且这些段按照顺序不交即可。
考虑将 \(S\) 的每段拉出来,记一段为 \(s\),显然在 \(T\) 中匹配越早越好。取出 \(T\) 的前 \(2|s|\) 个字符和 \(s\) 匹配,无论匹配成功与否至少删去了 \(|s|\) 个字符,所以只需要能做到 \(\tilde O(|s|)\) 做长度为 \(O(|s|)\) 的匹配,其中两个串都可能包含 \(\texttt{-}\),那么就可以 \(\tilde O(n)\) 解决原题。令 \(\texttt{-}\) 对应值 \(0\),其余字符对应任意非 \(0\) 整数,令 \(f(x,y)=xy(x-y)^2\),注意到 \(f(i,j)=0\) 当且仅当字符 \(i,j\) 匹配,对每个点开头的长度为 \(|s|\) 子串是否匹配即计算差卷积。对字符随机赋权,在模 NTT 模数下计算即可。总复杂度 \(O(n \log n)\)。
126 CF1936D
和 JOI 的鱼 2 类似,我们希望线段树维护修改,并维护 \(O(\log V)\) 个前后缀信息,原因是一个序列的本质不同前缀 \(\mathrm{OR}\) 只有 \(O(\log V)\) 个。合并时双指针计算跨过中点的答案,新的前后缀先保留以前的再加入另一个相对区间的前后缀即可。复杂度 \(O(n \log n \log V)\)。
127 CF1918G
首先根据原序列和新序列总和相等可以说明 \(\sum \limits_{i=2}^{n-1} a_i=0\)。
考虑归纳。每次增加两个数。对于合法序列 \(a_1,a_2,\cdots,a_n\),注意到取 \(a_{n+1}=-a_n\) 以及 \(a_{n+2}=a_{n-1}-a_n\)。符合要求。搜索出 \(n=2\) 和 \(n=7\) 的解即可。观察这样的构造可以发现呈现周期形式,所以不会出现 \(0\) 也不会超出限制范围。
128 CF1879F
人 \(i\) 的死亡时间为 \(h_i \times \lceil \dfrac{a_i}{x}\rceil\)。枚举 \(x\),只需要考虑 \(a_i\) 构成的 \(O(\dfrac{V}{x})\) 个区间即可,通过一些预处理不难做到调和级数 \(O(n \log n)\) 的复杂度。
129 CF1845F
不难知道所有相遇时间 \(t\) 可以表示为 \(t=\dfrac{2lk}{v_i+v_j}\) 或 \(t=\dfrac{2lk}{v_i-v_j}\),其中 \(k\) 为正整数。
首先通过卷积求出集合 \(V\) 满足对于任意 \(x \in V\) 都有 \(x=v_i+v_j\) 或 \(v_i-v_j\),我们要求有多少 \(t\) 可以表示为 \(\dfrac{2lk}{x}\) 的形式。
直接计算会算重。钦定代表元,对每个 \(\dfrac{2lk}{x}\) 在他们的既约分数表示下计算。将每个 \(x\) 的因子也加入 \(V\)。对于每个 \(i \in V\) 计算 \(f_i\) 表示有多少结果约分后分母是 \(i\)。先计算 \(\dfrac{2lk}{i} \leq t\) 的 \(k\) 的个数,减去 \(f_j\) 即可,其中 \(j<i\) 且 \(j \mid i\)。复杂度 \(O(V \log V)\)。
130 CF1847E
\(n\leq 8\) 时爆搜。
\(n > 8\) 时,至少有一种数出现至少三次。选取前九个位置每三个查询一次,可以确定某三个位置相等,值都为 \(c\)。
进一步,如果 \(c>1\),对每个位置进行一次询问就知道结果了。
否则 \(c=1\),询问 \((a,b,i)\),其中 \(p_a=p_b=1\),\(p_i\) 未知,如果结果非 \(0\) 则知道 \(p_i=1\),否则知道 \(p_i \in [2,4]\)。如果至少积累了四个 \(i\) 使得结果为 \(0\),其中必有两个值相同,求出后就可以确定其余所有。否则最终不超过三个位置询问结果为 \(0\),这三个值除了 \((2,3,4)\) 外都可以区分。如果只剩两个位置,只有 \((2,2),(3,3),(4,4)\) 可以区分。只剩一个则无论如何无法区分。询问次数 \(n+O(1)\)。
131 NFLS CSP 模拟赛 T1
每条边可以来回走,每个环也可以来回走。求出每个环长的 \(\gcd\),以及每条边权值两倍的 \(\gcd\),总计为 \(w\)。那么询问时先走 \(d_a+d_b\) 的距离,然后走若干个 \(\gcd(w,z)\)。最小能表示出的数容易计算。求所有环边权和的 \(\gcd\) 只需要求所有非树边和树上路径构成的环的即可。
132 NFLS CSP 模拟赛 T2
倒序考虑。每次选取一个满足这个点能优先于集合内所有点删去的 \((a_i,i)\) 最小的点加入集合即可。
133 NFLS CSP 模拟赛 T3
按照相对顺序从小到大加数,\(f_{S,i,j,k}\) 表示加入了序列下标集合 \(S\),逆序对数 \(i\),最后一次加入的位置在离散化区间第 \(j\) 个内,这个区间总共有 \(k\) 个数。不难做到 \(O(2^n\mathrm{poly}(n))\),实际上大概是 \(O(2^nn^5)\) 到 \(O(2^nn^7)\) 不等。使用刷表法,有效状态实际上很小,均可以通过。
134 NFLS CSP 模拟赛 T4
只考虑 \(k\leq 20\)。
求出每个点到每种颜色的任意一个点的最短路最小值,这可以 \(O(k)\) 次 BFS 解决,复杂度 \(O(kn)\)。记其为 \(f_{x,c}\)。这样 \(x,y\) 的距离大概就是 \(\min \limits_{c} \{f_{x,c}+f_{y,c}+1\}\),除非不进行中转,此时 \(x,y\) 在一条公路上且距离不超过 \(O(k)\),后面重算即可。现在只需要求 \(\sum \limits_{x,y} \min \limits_{c} \{f_{x,c}+f_{y,c}+1\}\)。
考虑令 \(g_{a,b} = \min \limits_{d_x=a} f_{x,b}\),也就是 \(a,b\) 颜色之间的最短路。我们知道 \(f_{x,c} \leq g_{d_x,c}+1\),因为转一次即可。
枚举 \(x,y\) 计算 \(d_i=x,d_j=y\) 的 \((i,j)\) 的贡献。记 \(v\) 为 \(\min \limits_{c} \{g_{x,c}+g_{y,c}+1\}\),则我们知道 \(\min \limits_{c} \{f_{x,c}+f_{y,c}+1\} \in [v,v+2]\),分别考虑其等于 \(v,v+2\) 的条件,算出总个数后分别减去他们得到 \(v+1\) 的个数。
- \(\min \limits_{c} \{f_{x,c}+f_{y,c}+1\}=v\)。此时要求存在取到 \(v\) 的 \(c\) 满足 \(f_{x,c}=g_{d_x,c}\) 且 \(f_{y,c}=g_{d_y,c}\)。前者取到 \(v\) 限制集合 \(S\),后者对于 \(x,y\),分别产生了限制 \(T_x,T_y\)。那么要求即为 \(S \cap T_x \cap T_y \neq \varnothing\)。直接 AND 卷积可以做到 \(O(k2^k)\),总复杂度 \(O(k^32^k)\),进一步只对每个 \(x\) 求超集和,然后容斥,枚举 \(S \cap T_x \cap T_y\) 的一个子集即可,总复杂度 \(O(k^22^k)\)。
- \(\min \limits_{c} \{f_{x,c}+f_{y,c}+1\}=v+2\)。根据上述限制有 \(T_x \cap S=\varnothing\),\(T_y \cap S=\varnothing\),以及令 \(S'\) 为值取到 \(v+1\) 的 \(c\),有 \((T_x\cap T_y \cap S')=\varnothing\),\(S\) 和 \(S'\) 无交,分别容斥,枚举 \(T_x \cap T_y \cap S'\) 的子集,然后 \(x,y\) 独立,分别计算满足前者限制情况下有多少 \(x,y\)。分别枚举 \(T_x \cap S\) 的子集和 \(T_y \cap S\) 的子集即可,总复杂度 \(O(k^22^k)\)。
这样我们做到了总复杂度 \(O(k^22^k+kn)\)。

浙公网安备 33010602011771号