2026.7 做题记录
1 QOJ18242
直接 DP 是形如 \(f_{i,j}\) 表示考虑了 \(b_1\) 到 \(b_i\) 且 \(b_i=j\) 的序列个数,然而基本无法优化。
将 \(a\) 取后缀 \(\min\) 得到一个单调不降的序列。将值域按照 \([2^i,2^{i+1})\) 分 \(O(\log V)\) 段,对于每段考虑 \(a\) 的值在这段的区间 \([l,r]\),那么从 \(b_{l-1}\) 到 \(b_r\) 必然是找到最左的位置 \(j \in [l,r]\) 满足 \(b_j \geq 2^i\) 后,\(b_j=b_{j+1}=\cdots=b_r\),而 \(b_{l-1},b_l,\cdots,b_{j-1}\) 必定+ 小于 \(2^i\) 没有限制,所以唯一限制就是 \(a_j \geq b_j \geq 2^i\)。我们关心 \(b_{l-1}\) 到 \(b_r\) 有多少本质不同的数然后插板,可以做 \(O(\log V)\) 次狄利克雷前缀和从而得到答案。这样总共做 \(O(\log^2 V)\) 次,每次 \(O(V \log V)\) 或 \(O(V \log \log V)\),复杂度太高了。然而注意到每一层只需要做到 \(a_r\) 的狄利克雷前缀和,而 \(\sum a_r = O(V)\),所以所有层分别做一次是 \(O(V \log V)\) 或 \(O(V \log \log V)\) 的,每层做 \(O(\log V)\) 次,总复杂度 \(O(V \log^2 V)\) 或 \(O(V \log V \log \log V)\),可以通过。
2 CF2182G
结构是 DFS 序。注意到问题等价于给每个点选定一个重儿子,使得除了根所在重链以外的重链长度不超过 \(k-2\)。然后将答案乘以 \(\prod (c_i-1)!\),\(c_i\) 是儿子个数。重儿子的含义是所有儿子中最后一个 DFS 的儿子。
直接 DP 是 \(f_{i,j}\) 表示 \(i\) 子树,从 \(i\) 开始重链长度为 \(j\) 的方案数。复杂度 \(O(n^2)\)。注意到 \(j\) 不超过子树深度,长链剖分优化即可,复杂度 \(O(n \log \mathrm{mod})\),瓶颈仅在于转移过程需要快速幂求逆元。代码非常好写。
3 CF2180F2
记现在在哪个点,以及附近 \(O(1)\) 个交点状态啥的,然后矩阵优化转移,没意思。
4 CF2178I
可以说明平面整点正多边形只能是正方形,从而图是二分图。
左侧点集 \(L\),右侧点集 \(R\),不妨假设 \(|L|\leq |R|\),从而 \(|L| \leq 15\)。枚举 \(L \cap T = S\),右侧每个点的度数已经确定和右侧选点无关,只需考虑 \(L \setminus S\) 的贡献如何计算。
注意到 \(\prod (f+1)\) 组合意义是为每个不在 \(T\) 内的点选定至多一条出边,考虑 DP。依次考虑 \(R\) 中每个点 \(j\),记 \(f_{I}\) 表示已经为左侧点集 \(I\) 选定出边,其中 \(I \subseteq (L \setminus S)\),所以状态数总和 \(O(3^{\frac{n}{2}})\)。转移分类讨论 \(j \in T\) 或 \(j \notin T\),若是后者,直接将贡献乘以 \(j\) 度数加 \(1\),若是前者,从一个 \(J \subseteq I\) 转移,要求 \(I \subseteq (J \cup K)\),\(K\) 是 \(j\) 的属于 \(L \setminus S\) 的邻居集合。\(K\) 只和 \(j\) 有关而和 \(I\) 无关,高维前缀和即可,这里的高维前缀和相当于只对 \(K\) 里面的维做前缀和,其他维保持不变。
总复杂度 \(O(n^23^{\frac{n}{2}})\),可以通过。
5 CF2174F
和度数有关的树计数,考虑双射 prufer 序列。
问题等价于计数长度 \(n-2\) 值域 \([1,n]\) 的合法序列个数,点 \(i\) 在树上的度数是序列中 \(i\) 的出现次数 \(+1\),所以限制相当于对于每种颜色其对应的点集出现次数总和的奇偶性。直接 DP 就可以得到一个三次方算法。
这个结构显然是 EGF。先考虑单个颜色的 EGF。对于颜色 \(c\),设有 \(k\) 个点颜色为 \(c\),总出现次数偶数与奇数的 EGF 分别是:
\(F_0(x)=\sum \limits_{2 \mid n} \dfrac{k^nx^n}{n!},\\ F_1(x)= \sum \limits_{2 \nmid n} \dfrac{k^nx^n}{n!}\)
我们知道 \(F_0(x)=\dfrac{e^{kx}+e^{-kx}}{2}\) 以及 \(F_1(x)=\dfrac{e^{kx}-e^{-kx}}{2}\)。
即求 \([x^{n-2}](n-2)!\prod F_{a_i}(x)\)。
每个 \(F_{a_i}(x)\) 只有两项且都是 \(e^{kx}\) 形式,且 \(-n \leq \sum k \leq n\),直接展开记录 \(f_k\) 为 \(e^{kx}\) 系数,然后计算 \([x^{n-2}](n-2)!\prod \limits_{i \in [-n,n]} f_ie^{ix}=(n-2)!\prod \limits_{i \in [-n,n]} f_i \dfrac{i^{n-2}}{(n-2)!}\) 即可。复杂度 \(O(nm)\)。
6 CF2169F
判定一个序列可行的方法是在子序列自动机上每次选最远的位置匹配,也就是找到 \(a_{i,1},a_{i,2},\cdots,a_{i,l_i}\) 中,目前这个后缀里最靠前的出现位置最远的转移。
考虑称转移过程中,\(a_{i,1},a_{i,2},\cdots,a_{i,l_i}\) 在后缀里最靠前的出现位置的这些点为关键点,这些点一定存在否则相当于后缀中某个数没出现直接就无解了。考虑生成 \(c\) 的方式,先将关键点从前往后排,每个 \(i\) 内部有 \(l_i!\) 种排列方式,而 \(i\) 之间肯定是从前往后顺序排布的。然后插入 \(n-\sum l\) 个其余数进入空位中,为了符合关键点的限制我们要求插入的数不在这段之后的关键点中出现,也就是限制了这段内的数的种数。因为 \(l_i \leq 5\) 每段可填的数的的个数包含于 \([m-5,m]\),而段之间的顺序是不重要的。记 \(c_i\) 表示能填 \(m-i\) 个数的段的个数,\(i\) 相同的一起构造 OGF 然后多项式乘法合并就行。复杂度 \(O(n \log n)\)。
7 CF2163E
当 \(c=1\) 时,如果整个网格全是 \(1\) 随便传一行一列,否则传字典序最大的行和字典序最小的列。
\(c=0\) 则是,传字典序最小的行和字典序最大的列。
对于后手,如果得到的两个串 \(s,t\) 有 \(s\geq t\) 则报告连通否则不连通。
我们只需证明对于一个不全相同的网格,必定存在某行和某列满足这行字典序比这列大,以及存在某行某列满足这行字典序比这列小。
证明:
考虑网格第一行第一列,若全部相同则归纳到 \((n-1)\times (n-1)\) 子矩阵。
否则证明存在一行比另一列大。找到任意一行使得开头为 \(1\),若不存在则说明第一列全是 \(0\),任取一个存在 \(1\) 的行和第一列即可。然后找任意一列使得开头为 \(0\),若不存在则说明第一行全是 \(1\),取第一行和任意一列即可。那么这一行和这一列开头分别是 \(1,0\)。存在列比行大同理。\(\square\)
8 P17024
每个位置直接按照位从前往后确定答案是困难的,考虑一些整体性的做法。注意到答案单调不增,考虑按照位从高到低做类似整体二分的分治,对于目前区间 \([l,r]\),已经确定了区间在第 \(i\) 位后面的答案 \(p\),现在要求第 \(i\) 位是 \(1\) 还是 \(0\),会有一个分界点 \(m\) 使得 \([l,m]\) 答案第 \(i\) 位是 \(1\) 且 \((m,r]\) 答案第 \(i\) 位是 \(0\) 然后递归。我们还要维护一个长度为 \(2^i\) 的桶,每个位置 \(S\) 记录 \([1,l)\) 内 \(S \cup p\) 子集权值和,向下递归要对左侧做高维前缀和,不过这个可以继承上面的答案然后修改。总复杂度 \(O((n+2^k)k)\)。
9 CF2158F1
考虑 \(c\) 种数至多产生 \(\dfrac{c(c+1)}{2}\) 种本质不同无序二元组,先考虑能不能构造到这个界。考虑一条路径 \(a_1 \rightarrow a_2 \rightarrow a_3 \rightarrow \cdots \rightarrow a_n\),发现每条边至多经过一次,所以考虑 \(c\) 个点的包含自环的完全图的欧拉路径,发现若 \(c\) 为奇数可以取到这个上界,此时每个点度数都是偶数。而若 \(c\) 为偶数,需要断开 \((1,2),(3,4),\cdots,(c-3,c-2)\) 的边,只有 \(c-1\) 和 \(c\) 两个点度数是奇数,从这两个点开始构造欧拉路径。
所以对于单个 \(c\) 可以计算出对应 \(n\) 的上界,由于 \(n \leq 700\) 所以只需要 \(c=37\)。
现在问题是怎么构造 \(c\) 个不同的数使得任选两个 \(\gcd\) 不同。在质因数角度考虑。注意到取 \(a_i=2^i3^{36-i}\),\(i\) 从 \(0\) 到 \(36\) 恰好符合要求,问题解决,复杂度线性。
10 CF2158F2
延续 F1 的思想,根据 \(n\) 的范围可知,只需要构造 \(100\) 个两两不同的数使得任选两个求 \(\gcd\) 的结果互不相同即可。
在 F1 中我们的构造是 \(a_i=2^i3^{n-i}\)。为了构造更多的数,我们考虑构造一个矩阵形式,\(w_{i,j}=2^{i}3^{n-i}5^{j}7^{m-j}\),然后取出其中所有 \(w_{i,j} \leq 10^{18}\) 的 \(w_{i,j}\),我们先考虑这些数是否符合要求:
任取 \((a,b),(c,d)\),我们知道 \(\gcd(w_{a,b},w_{c,d})=2^{\min\{a,c\}}3^{n-\max\{a,c\}}5^{\min\{b,d\}}7^{m-\max\{b,d\}}\),其值被无序二元组 \((a,c)\) 与 \((b,d)\) 唯一确定,所以我们有 \(\gcd(w_{a,b},w_{c,d})=\gcd(w_{c,b},w_{a,d})\) 不符合要求。不难说明所有 \(\gcd\) 相同的都一定形如这样,其在矩阵上是一个矩形的两种对角。为了解决这个问题,令 \(w_{a,b}=2^a3^{n-a}5^{b}7^{m-b}11^{a+b}\) 即可使得上述的 \(\gcd\) 在 \(11\) 的幂次上前者是 \(a+b\),后者是 \(b+c\) 或 \(a+d\) 均不等于 \(a+b\),即符合要求。为了能选出尽量多的 \(a\),显然应该将 \(a+b\) 放在 \(2\) 的次幂上即 \(w_{a,b}=2^{a+b}3^a5^{n-a}7^b11^{m-b}\),取 \(n=m=9\) 能构造出 \(100\) 个。
11 P16903
离线显然可以树上莫队。
对颜色的出现次数根号分治,分为大于等于 \(\sqrt n\) 和小于 \(\sqrt n\),前者只有不超过 \(\sqrt n\) 种,查询时对这些颜色求其在路径上出现次数即可,只需要对每个点记录一个大小 \(O(\sqrt n)\) 数组表示根到这个点上,这些颜色分别的出现次数即可 \(O(1)\) 查询。
另一方面,对于出现次数小于 \(\sqrt n\) 的数,我们在查询时希望对于所有 \(i\) 从 \(1\) 到 \(\sqrt n\) 求出路径上有多少种颜色出现 \(i\) 次。为此直接考虑树分块。对于树上任意两个关键点记录一个大小 \(O(\sqrt n)\) 数组表示每种出现次数对应多少颜色,预处理只需要从每个关键点出发开始 DFS 即可。查询时继承数组后要加入删除 \(O(\sqrt n)\) 个数,那么我们还希望求出这个数在对应那两个关键点的路径上的出现次数从而维护信息。可以对所有关键点以及关键点形成的虚树上的所有点记录大小 \(O(n)\) 的数组表示根到这个点的路径中每种颜色出现次数,即可 \(O(1)\) 更新答案。
总时间复杂度 \(O((n+q)\sqrt n)\),空间复杂度 \(O(n \sqrt n)\)。
12 QOJ7899
求出每个前缀和后缀答案,分别记为 \(f_i\) 和 \(g_j\),那么对于 \(i\) 答案就是满足对应条件的 \(f_a \times g_b\) 的和。
先考虑怎么求 \(f,g\),发现直接 DP 是难以处理贡献的,而 CDQ 分治转为静态问题后不难 \(O(n \log^2 n)\) 解决。
然后考虑怎么求答案。类似的依然考虑 CDQ 分治,对于 \([l,r]\) 和中点 \(m\),分类讨论 \(i\) 在 \(m\) 哪一侧,以在右侧为例,枚举右端点计算贡献,分类讨论 \(i\) 为区间最大值和非最大值,细节很繁琐。复杂度 \(O(n \log^2 n)\)。
13 P16459
最简单的 DP 是 \(f_{i,j}\) 表示 \(i\) 子树选 \(j\) 个点的答案,需要花 \(O(sz_xsz_y)\) 的复杂度合并两棵子树,复杂度 \(O(n^2)\)。
先考虑如何优化到 \(O(sz_x+sz_y)\) 合并。这是简单的,注意到 \(f \times g\) 的第 \(i\) 项是形如 \(f_a\) 和 \(g_{i-a}\) 合并,\(f_a,g_{i-a}\) 任何一项若同时可以取 \(0,1\) 那么答案这一位就可以取 \(0\) 或 \(1\),反之当且仅当 \(f_a=g_{i-a}\) 总成立则值只能是 \(0\),总不等则值只能是 \(1\),其余方面其值都可以同时取 \(0,1\),只需要字符串哈希维护就可以以两棵子树大小和的复杂度合并两棵子树。
注意到子树并不特殊,上述合并在树簇上也可以进行。建出静态 Top Tree 维护即可,复杂度 \(O(n \log n)\)。
14 P17063
考虑对序列分块,按 \(B = \sqrt n\) 分块,将每个块缩为一个点,如果能以 \(O(m^2)\) 个点的代价表示出长度为 \(m\) 的序列任意缺失一对二元组的信息,那么令 \(m=\sqrt n\),然后每个点对应原序列一个块,即 \(O(n\sqrt n)\) 个点,查询再加入 \(O(\sqrt n)\) 个 \(x,y\) 所在块内的点即可。
现在只需解决怎么以 \(O(n^2)\) 的代价表示出长为 \(n\) 的序列任意缺失二元组的信息。仿照缺一分治,考虑分治,对于区间 \([l,r]\) 已经求出一个点其信息为 \([1,l)\cup (r,n]\),分别递归 \([l,m],(m,r]\),然后考虑 \(x \in[l,m], y\in (m,r]\) 的信息如何求出。设计另一个函数拥有四个参数 \([l_1,r_1],[l_2,r_2]\) 表示目前处理 \(x\in[l_1,r_1]\) 与 \(y \in [l_2,r_2]\) 的答案,每次选长度较大的区间分裂。其复杂度为 \(T(n) = 4T(\dfrac{n}{2})+O(n)=O(n^2)\),而外层分治有 \(T_2(n)=2T_2(\dfrac{n}{2})+O(n^2)=O(n^2)\),故整题在 \(O(n \sqrt n)\) 的次数内得以解决。
15 P17019
对于 \(k\) 的问题显然等价于树上选 \(k\) 条点不交祖先后代链最大化边权和。
我们首先说明答案有凸性:考虑费用流模型,每个点拆成入点和出点,\(S \rightarrow u_i(1,0)\),\(u_i \rightarrow v_i(1,0)\),\(v_i \rightarrow T(1,0)\),对于每条边 \(a \rightarrow b\),边权 \(w\),其中 \(a\) 是父亲,\(v_a \rightarrow u_b(1,w)\),流量为 \(k\) 的最大费用流即为答案。故答案关于 \(k\) 上凸。
然后有两种做法,分别是反悔贪心和直接对 DP 值维护差分。前者大概是说,不难发现上述费用流的每次增广路形态必定为以下两种之一:
- 选择一个可选的点 \(u\),加入 \(u\) 子树内从 \(u\) 出发最长路。
- 选择一个可选的点 \(u\),加入 \(u\) 子树内从 \(u\) 出发最长路,并且将其父亲 \(f\) 向下的边替换为 \((f,u)\)。
并且加入边总次数 \(O(n)\),所以增广后可以暴力维护所有信息。不难使用一些数据结构做到 \(O(n\log n)\)。
另一方面,注意到有显然的 DP 是 \(f_{u,i}\) 表示以 \(u\) 为根子树选了 \(i\) 条路径的最大权值和,由凸性直接维护差分,转移时对于 \(u\) 的若干儿子 \(s_1,s_2,\cdots,s_k\),选取若干个儿子时额外的贡献是这些儿子与 \(u\) 之间的边权最大值。那么先将所有儿子的从第二个位置开始的差分启发式合并,然后再考虑选取哪些儿子,必定是 \(f_{j,1}\) 最大的若干个,或 \(w_{u,j}\) 最大的一个和 \(f_{j,1}\) 最大的若干个。这是不难求出的。容易发现一个 \(j\) 的 \(f_{j,1}\) 一定比 \(f_{j,2}-f_{j,1}\) 大所以最优解自然满足先选 \(f_{j,1}+w_{j,u}\) 再选后面的。复杂度 \(O(n \log^2 n)\),启发式合并使用 \(1\) 个 \(\log\) 的结构例如平衡树 finger search 或者可并堆就是 \(O(n \log n)\) 了。
16 P16708
显然相邻两个点颜色之差不超过 \(1\),设 \(A,B\) 到 \(1\) 最短路分别为 \(x,y\),不妨设 \(x \leq y\),即找到 \(r-l+1\) 最小的 \([l,r]\) 满足 \(l \leq x \leq y \leq r\) 且只保留到 \(1\) 最短路在 \([l,r]\) 之间的点的诱导子图中 \(A,B\) 连通。
对于每个 \(l\) 求最小的 \(v_l\) 使得 \(r=v_l\) 时条件成立。显然 \(v_l\) 单调不降,整体二分中使用可撤销并查集,复杂度 \(O(n \log^2 n)\),常数很小,可以轻松通过。
正解是考虑记 \(d_i\) 表示 \(1\) 到 \(i\) 最短路。因为任意一条边的两端的 \(d\) 相差不超过 \(1\),所以按照 \(r\) 扫描线求最大的 \(l\) 的过程中每次 \(r \gets r+1\) 只需考虑 \(r\) 和 \(r+1\) 之间的边,此时如果有两个点 \(a,b\) 满足 \(d_a=d_b=r\),且另有一个点 \(c\) 满足 \(d_c=r+1,(a,c)\in E,(b,c)\in E\),那么可以将 \(a,b\) 合并为一个点,注意到这么合并后整个结构是一棵树,而最大的 \(l\) 即为 \(A,B\) 在树上的 LCA 对应点权。这样既可做到 \(O(n \alpha(n))\) 的复杂度。
17 GYM102512D
考虑反过来考虑,枚举区间并的每个补集 \([L,R]\),对 \(\lfloor \dfrac{L-1}{T} \rfloor\) 整除分块,然后相当于限制掉了若干 \(R\) 的区间不可行,将区间拉出来后排序。不难做到 \(O((X+Y)\sqrt n\log n)\) 时间与 \(O((X+Y)\sqrt n)\) 空间,但空间常数有点大可能过不去。
18 P16705
详细揭秘没有脑子如何通过这个题。
注意到问题等价于对有祖先关系的点连边 \(d_u \oplus d_v\),求最小生成树。
直接 Boruvka,对于每个点 \(u\) 要找到祖先和后代中与其颜色不同的点 \(v\) 最小化 \(d_u \oplus d_v\),只需对 \(d\) 建立 01-Trie 每个点维护子树中存在的至多两种颜色即可。对于祖先信息可以在 DFS 过程中维护可撤销 Trie,子树信息直接 Trie 合并。复杂度 \(O(n\log n\log V+q\log n)\)。
更加好写的做法需要进一步观察。考虑用 Kruskal 刻画最小生成树,枚举 \(k\) 考虑合并边权最高位为 \(k\) 的边,此时原图已经在 \(k\) 之前的位构成了若干个连通块,显然这些连通块的点权的二进制第 \(k\) 位必定全部相同。考虑第 \(k\) 位时,对于每个点 \(u\),我们声称其祖先中满足点权和 \(u\) 点权在大于 \(k\) 位上相同的只有一种颜色,因为否则若有两种则他们三个之间一定存在边权最高位小于 \(k\),然后就不难维护了。复杂度应该是相同的但好写很多。
19 P16706
将相邻两个取或,花 \(64\) 个逻辑门,然后变成在 \(64\) 个 bit 中判断只有一个 \(1\) 或至少有两个 \(1\)。
将 \(64\) 个位看作一个 \(8 \times 8\) 矩阵,求出每行和每列的或,需要 \(7 \times 8 \times 2 = 112\) 个逻辑门,然后需要判定所有行的或是否至少有两个 \(1\) 以及所有列的或是否至少有两个 \(1\)。相当于要判断两次 \(8\) 个 bit 中是否至少有两个 \(1\)。将 \(8\) 看成三位二进制数,对每位求出是 \(0\) 的和是 \(1\) 的或,发现求一次 \(8\) 个 bit 需要 \(19\) 个门,总个数 \(64+112+2\times 19+1=215\) 恰好可以通过。
20 P17000
显然我们希望按照字典序依次加入所有点维护集合 \(S\),加入一个点后要判断是否存在合法的 \(T\) 满足 \(S \subseteq T\) 且 \(|T|=k\)。
我们声称若 \(I\) 可行且 \(|I|=a\),对于任意 \(b \in [a,n]\) 总存在可行的 \(J\) 满足 \(I\subseteq J\) 且 \(|J| = b\)。证明考虑依次加点,只需证明 \(b=a+1\),从根开始递归,每次向两侧儿子子树中没有填满的深度较小的一侧走直至到一个空节点,容易说明正确性。
所以问题转化为维护 \(S\) 后查询 \(|T|\) 最小的合法 \(T\) 满足 \(S \subseteq T\),然后判定 \(|T|\) 和 \(k\) 大小关系即可。
对于每个子树我们只关心其深度,所以 \(f_{u,i}\) 表示在 \(u\) 子树内选点使得最大深度为 \(i\) 的情况下点的个数的最小值,修改直接向上更新祖先 DP 值即可。平衡二叉树的深度是 \(O(\log n)\) 的所以总复杂度 \(O(n \log^2 n)\)。
21 QOJ1318
考虑求本质不同子序列的一个从前往后的 DP。\(f_{i,c}\) 表示到了 \(i\) 为止,有多少本质不同子序列在下一次加字符的时候在末尾加了一个 \(c\)。其中 \(f_{i,0}\) 表示这段前缀的本质不同子序列个数。转移 \(i\rightarrow i+1\),记 \(s_{i+1}=x\),先将 \(f_i\) 复制到 \(f_{i+1}\),然后对于所有 \(j \neq x\) 有转移 \(f_{i,x} \rightarrow f_{i+1,j}\)。直接线段树维护是 \(O(n|\Sigma|^3 \log n)\)。
注意到转移矩阵是稀疏的并且有逆所以可以维护前缀积和前缀积的逆,复杂度 \(O(n|\Sigma|^2)\)。
22 CF1109C
。
23 CF1017G
如果没有二类操作直接在每个点上维护一个值表示这个点操作 \(1\) 操作的次数,那么查询即判断询问点到根是否存在一段后缀满足点权和大于等于点的个数。
可以发现即使有二类操作我们也可以直接将子树点权归零并将这个点权改为 \(-s\) 从而抵消贡献,\(s\) 是到根路径最大后缀和状物。树剖维护,复杂度 \(O(n\log^2 n)\)。
24 P17068
神秘题。
先假装双方都确定好了顺序,依次打对面的 \(1\) 到 \(n\),对于 HP 和 ATK 序列 \(a_1,a_2,\cdots,a_n\) 和 \(b_1,b_2,\cdots,b_n\),计算 \(f=\sum \limits_{i=1}^n b_i\left(\sum \limits_{j=1}^i a_j \right)\),我们声称双方的 \(f\) 较大的那个必然获胜,若双方 \(f\) 相同则平局。我们接下来证明这一结论正确性:
对于任意博弈过程,令 \(t\) 表示当前时刻,\(x(t)\) 表示甲方在 \(t\) 时刻及其之前受到的总伤害,\(y(t)\) 表示乙方在 \(t\) 时刻及其之前受到的总伤害,\(w(s)\) 表示甲方受到总共 \(s\) 点伤害后的攻击力,\(v(s)\) 同理表示乙方对应值。\(g(t) = \displaystyle \int_{0}^{x(t)} w(s)ds\) 以及 \(h(t)=\displaystyle \int_{0}^{y(t)} v(s)ds\)。我们声称游戏结束前对于任意 \(t\) 均有 \(g(t)=h(t)\),从而 \(f\) 较大的一方获胜。现在考虑证明游戏结束前任意 \(t\) 均有 \(g(t)=h(t)\)。考虑 \(x(t)\) 关于 \(t\) 求导 \(\dfrac{dx}{dt} = v(y(t))\),那么 \(g(t)\) 关于 \(t\) 求导 \(\dfrac{dg}{dt}=w(x(t))v(y(t))\)。而 \(y(t)\) 关于 \(t\) 求导 \(\dfrac{dy}{dt}=w(x(t))\),那么就有 \(h(t)\) 关于 \(t\) 求导 \(\dfrac{dh}{dt}=v(y(t))w(x(t))=\dfrac{dg}{dt}\),且有 \(g(0)=h(0)=0\),从而 \(g,h\) 相等。
而 \(f_a=\displaystyle \int_{0}^{h_a} w(s)ds\) 以及 \(f_b = \displaystyle \int_{0}^{h_b} v(s)ds\) 即两者的 \(f\) 对应的即为双方的阈值,若 \(g\) 随着 \(t\) 增长先到达 \(f_a\),那么意味着甲被完全击败而乙获胜,反之亦然。其中 \(h_a,h_b\) 分别对应双方的总 HP。\(\square\)
还需要找到一个排列最小化对方的 \(f\) 值,邻项交换排序即可,式子写出来是按照 \(\dfrac{b}{a}\) 从大到小排序。
25 CF1654E
相当于保留尽量多的位置使得这些位置满足对于所有 \(i<j\),\(\dfrac{a_j-a_i}{j-i}\) 相等且为整数,\(d\) 为共同的 \(\dfrac{a_j-a_i}{j-i}\) 即为公差。
直接枚举 \(d\) 计算 \(b_i=a_i-d \times i\) 的众数,复杂度 \(O(n^2)\)。
注意到 \(d=\dfrac{a_j-a_i}{j-i}\),所以 \(j-i \leq \left| \dfrac{a_j-a_i}{d}\right|\)。对于 \(|d| \leq B\),计算众数,复杂度 \(O(nB)\),对于 \(|d|>B\),枚举选的最靠前的位置 \(i\) 并枚举之后 \(O(\dfrac{n}{B})\) 个 \(j\) 计算 \(\dfrac{a_j-a_i}{j-i}=d\) 的众数,复杂度 \(O(\dfrac{n^2}{B})\),取 \(B=O(\sqrt n)\) 得复杂度 \(O(n \sqrt n)\)。
26 CF1654F
考虑比较 \(t_a\) 和 \(t_b\) 的字典序大小关系,需要快速找到 LCP。注意到 \(x\oplus 0,x\oplus 1, \cdots, x\oplus (2^k-1)\) 对应二元组 \((x,k)\) 可以从高到低位通过 \(O(n)\) 个二元组继承而来,所以直接设 \(f_{x,k}\) 表示 \(s_{x \oplus 0},s_{x \oplus 1},\cdots, s_{x \oplus (2^k-1)}\) 的哈希值,查询 LCP 只需从前往后依次判断多的 LCP 的长度是否至少为 \(2^n,2^{n-1},2^{n-2},\cdots,2^0\),复杂度 \(O(n2^n)\)。
27 CF1654G
定义一个点 \(u\) 为关键点当且仅当这个点存在一个邻居 \(v\) 使得 \(h_u=h_v\),容易发现对于每个点 \(u\) 都存在邻居 \(v\) 满足 \(h_v < h_u\),我们声称对于 \(u\) 的答案即为 \(u\) 能直接走到的 \(h_v\) 最小的关键点 \(v\) 的 \(2h_u-h_v\),根据势能定义不难分析得到,然后点分治即可。复杂度 \(O(n\log n)\) 或 \(O(n\log^2 n)\)。
28 CF1025F
注意到任意两个不交三角形恰好存在两条两个三角形各选一个点的连边使得这条直线两侧各有两个点和这条边上的那个点构成这两个三角形。
枚举这条边是什么,两侧分别有 \(c,n-2-c\) 个点,那么贡献是 \(2\dbinom{c}{2}\dbinom{n-c-2}{2}\),然后将答案总和除以 \(2\)。为了快速计算,先枚举边的第一个点 \(i\),换系到 \((x_i,y_i)\) 原点的坐标系,那么限制是幅角区间,可以直接做。复杂度 \(O(n^2)\) 或 \(O(n^2 \log n)\),均可通过。
29 CF1025E
找一个中间态比如全在全在第一行或者对角线之类的,然后就不难了。
30 CF1025G
考虑鞅与停时定理。
构造函数 \(f\) 对于目前的状态给出一个势能,使得每次势能的增量期望为 \(-1\) 且终局的势能唯一且确定。由于操作只在两个连通块之间进行,对于一个根下面接着 \(x\) 个的点的连通块设其函数为 \(f(x)\),全局状态的函数值为所有连通块 \(f\) 之和,只要 \(f\) 符合条件那么既有整体符合条件。
考虑 \(f\) 应该满足的性质:对于下面分别挂着 \(x,y\) 个点的两个连通块,其新的函数期望值为 \(\dfrac{1}{2}\left(f(x+1)+yf(0)+f(y+1)+xf(0)\right)\),那么其应该满足 \(f(x)+f(y)-1=\dfrac{1}{2}\left(f(x+1)+yf(0)+f(y+1)+xf(0)\right)\),不妨假设 \(f(0)=0\) 且 \(y=0\),那么我们有 \(f(x)-1=\dfrac{1}{2}\left(f(x+1)+f(1)\right)\),进一步带入 \(x=0\) 我们有 \(f(1)=-1\),从而 \(f(x)-1=\dfrac{1}{2}\left(f(x+1)-1\right)\),即 \(f(x+1)=2f(x)-1\),注意到其满足 \(f(x)=1-2^{x}\) 且满足 \(f(0)=0,f(1)=-1\) 满足所有要求。
构造 \(g_i\) 为第 \(i\) 次的 \(f\) 加 \(i\),那么我们知道 \(g\) 是鞅,对于停时 \(t\) 有 \(\mathbb{E}[g_t]=\mathbb{E}[g_0]\),而 \(\mathbb{E}[g_t]=\mathbb{E}[t]+f_t=\mathbb{E}[t]+(1-2^{n-1})\),\(\mathbb{E}[g_0]\) 为定值容易计算,所以 \(\mathbb{E}[t]=\mathbb{E}[g_0]-(1-2^{n-1})\),复杂度线性。
31 UNR 2026 D1T1
注意到一个点至多进行一次操作,从而可以发现每个点在所有区间中的结果只有两种,要么不变,要么是其成为左侧一段后缀和右侧一段前缀中单峰的峰,且这个后缀前一个位置和前缀后一个位置均比这个点大。相当于限制 \(l\leq x\) 以及 \(r \geq y\),造成额外的贡献,二维数点可以 \(O(n \log n)\)。\(x,y\) 的性质其实非常好,可以做到线性。
32 UNR 2026 D1T2
设 \(d\) 表示所有段的相同的颜色数,我们声称若一个序列合法则只有一个合法的 \(d\)。
然后判定考虑每次跳最短的距离直至颜色数为 \(d\),跳 \(k\) 次跳到的要 \(\leq n\),每次跳最远的则要 \(\geq n\),不难理解正确性,证明哇吧会。
显然符合前者的 \(d\) 是一段前缀,满足后者的 \(d\) 是一段后缀,设分别为 \([1,r]\) 和 \([l,n]\),注意到一定有 \(r=l-1\) 或 \(r=l\),所以贡献可以写为 \(r-l+1\),只需要对每个 \(d\) 分别计算有多少序列满足第一种和第二种限制。DP 写出来应该是可以做到 \(O(n^4)\) 的,看起来细节很多。
33 QOJ13651
根据 Dilworth 一定有 LIS 长度乘以 LDS 长度 \(\geq n\),所以 LIS 长度 \(\geq 16\) 或 LDS 长度 \(\geq 17\),前者传一个长度为 \(16\) 的上升子序列,后者传一个长度为 \(17\) 的下降子序列即可。
34 模拟赛 T1
考虑 \(n \times 30\) 的 \(01\) 矩阵转置,也就是考虑每一列的结果,记第 \(i\) 列结果为 \(c_i\),记 \(w_{T}\) 为有多少 \(c_i=T\),则 \(w_T\) 对
\(b_S\) 贡献 \(w_T\) 当且仅当 \(\mathrm{popcount}(T \cap S) \equiv 1 \pmod 2\)。所以 \(b_S = \sum \limits_{T} w_T[\mathrm{popcount}(T \cap S) \equiv 1 \pmod 2]\),我们知道 \([x \equiv 1 \pmod 2] = \dfrac{1-(-1)^x}{2}\),所以我们可以通过 \(b\) 确定 \(w\) 的 xor FWT 结果,IFWT 回去即可确定所有 \(w\),然后贪心放入即可。
35 UNR 2026 D2T1
注意到满足 \(p_l < p_r\) 的区间 \([l,r]\) 可以全程免费合并到一起,从而只需 DP 求出每个前后缀最少划分为多少段即可。
36 CF1677D
有结论:对于排列 \(p\) 定义 \(v_i = \sum \limits_{j=1}^{i-1} [p_j>p_i]\),一次冒泡排序对 \(v\) 的影响是整体左移一位全局减一,末尾补 \(0\),证明考虑模拟一下冒泡过程就可以发现这一点。
从而每个点原始的 \(v\) 被限定在范围 \([l_i,r_i]\) 内,这是容易通过给定的 \(v\) 求出的,然后从前往后依次在 \([1,i-1]\) 插入 \(p_i\) 确定其排名将贡献相乘即可,复杂度线性。
37 CF1056H
只需判定是否存在形如 \(\texttt{A}+s+\texttt{B}\) 和 \(\texttt{A}+t+\texttt{B}\) 的子串满足 \(s \neq t\)。这等价于判断是否存在这样的 \(s,t\) 使得 \(s\) 和 \(t\) 的开头字符不同。
对串长根号分治,取阈值 \(B=\sqrt n\) 按照 \(|s_i|\) 和 \(B\) 的大小关系分为小串和大串。对于小串,可以在 \(\sum |s_i|^2 = O(n \sqrt n)\) 的复杂度内解决,直接枚举所有小串的所有子串即可。
对于包含大串的信息,考虑只有 \(O(\sqrt n)\) 个大串,枚举大串 \(S\) 并希望 \(O(n)\) 复杂度内判定。枚举其余所有串的所有后缀 \(t\),考虑在 \(S\) 中找到一个尽量靠前的后缀满足第一个位置和 \(t\) 开头相同而第二个位置不同,只需判定这两段后缀第三个位置开始后是否有交,对所有串倒着扫就可以。总复杂度 \(O(n \sqrt n)\)。
38 P17101
从后往前贪心,设之后的答案为 \(t\),在串 \(s_i\) 中取一个非空后缀 \(w\) 最小化 \(w+t\),比较两个后缀 \(w_1+t\) 和 \(w_2+t\) 大小关系直接二分哈希就行。复杂度 \(O(\sum |s_i| \log \sum |s_i|)\)。
39 CF1827C
有两种做法:
其一是考虑 \([l,r]\) 的合法性,从 \(l\) 开始每次找某个长度为偶数的回文前缀 \([l,x]\) 并更新 \(l \gets x+1\) 直至 \(l \gets r+1\),本质上是一个连通性问题。manacher 后对于相同的回文中心,连边形态形如 \([l_1,r_1] \rightarrow [l_2,r_2]\) 的两个长度相等区间对应点连边,ST 表优化即可。
其二是进行进一步观察。我们声称做法 \(1\) 中的选取的 \(x\) 唯一确定,只需要找到最小的 \(x\) 使得 \([l,x]\) 是偶数长度回文即可,原因是考虑若有两个 \([l,x_1],[l,x_2]\) 满足 \(x_1<x_2\),走 \([l,x_2]\) 必然可以被拆解为先走 \([l,x_1]\) 然后再通过 \([l,x_2]\) 内去掉一个前缀和多出来的两个回文串到达 \(x_2\),所以每个点出边唯一,直接 \(f_i = f_{r_i}+1\) 计算即可。复杂度线性。
40 CF2165F
对于每个 \(i\) 求出若其为 \(2,1,4,3,5\) 中的 \(2\),那么 \(5\) 的位置的最小值在哪里,记为 \(w_i\),区间 \([l,r]\) 合法当且仅当存在 \(i \in [l,r]\) 使得 \(w_i \leq r\),求出 \(w\) 后容易维护。
现在考虑怎么求 \(w\),显然 \(1\) 是 \(i\) 右边最小的 \(j\) 满足 \(a_j < a_i\),现在问题变为查询一个右上角 2-side 矩形内 \(4,3,5\) 子序列的 \(5\) 的位置的最小值。
我们声称只有 \(O(n)\) 种有用的 \(4,3,5\) 子序列。考虑三个位置 \(i,j,k\),我们发现 \(k\) 是 \(j\) 右边最近的满足 \(a_k > a_j\) 的位置,从而可以找到唯一的最好的 \(i\),即满足条件的最靠右的 \(i\)。所以枚举 \(j\) 就能唯一确定 \(i,k\),总共 \(O(n)\) 对有效答案,总复杂度 \(O(n \log n)\)。
41 CF2234G
考虑 DP。\(f_{i,j}\) 表示到达 \(i\) 权值为 \(j\),下一次操作的人是否胜利。注意到 \(f_{i,j}=0\) 当且仅当 \(\forall x \in [0,a_i],y\in[i+1,i+j+x]: f_{y,j+x}=1\),必要条件是 \(f_{i+1,j},f_{i+2,j},\cdots,f_{i+j,j}=1\),所以只有 \(O(n \log n)\) 个 \(f_{i,j}=0\),然后按照 \(i\) 从后往前维护,用线段树或者直接 set 维护连续段均可,复杂度 \(O(n\log^2 n)\)。
42 P5896
考虑答案关于 \(k\) 有凸性,先 wqs 二分变为选任意照片但是每选一张需要花费一个常数 \(w\),然后考虑整个结构。将每个点 \((x_i,y_i)\) 投影到主对角线上成为一个区间 \([l_i,r_i]\),原问题就等价于选若干区间 \([L_j,R_j]\) 使得对于任意 \(i\) 均存在 \(j\) 满足 \([l_i,r_i] \subseteq [L_j,R_j]\),容易发现 \([L_j,R_j]\) 这些区间不会存在一个包含另一个否则不优,所以 \(L,R\) 分别单调递增。同理限制区间也有 \(l,r\) 分别单调递增。
考虑 DP。\(f_i\) 表示考虑了 \((i,i)\) 左下的主对角线构成这个正方形内的所有点被覆盖的最小花费,转移枚举上一个选择的正方形的右上端点 \((j,j)\),考虑所有满足 \(r_x \in [j,i]\) 的点还未被 \(f_j\) 对应答案覆盖,那么 \(i,i\) 这个正方形的坐下位置应该是所有这样的 \(x\) 的 \(l_x\) 的最小值,假设为 \(k\),那么贡献就是 \(f_j+(i-k)^2-\max(0,j-k)^2+w\),\(w\) 是 wqs 二分的常数。考虑优化转移过程,注意到首先可以去掉满足 \([l_a,r_a] \subsetneq [l_b,r_b]\) 的 \([l_a,r_a]\),所以所有限制区间也是左右端点分别递增,这样的话可以发现对于一个 \(j\) 来说,\(k\) 是唯一确定的,就是 \(r_x>j\) 的所有区间中左端点最小的那个,此时其同时也是右端点最小的那个,那么相当于 \(i\) 没到对应右端点是不存在 \(k\) 不需要贡献,否则对应的位置就是 \(k\),那么直接斜率优化即可。
总复杂度 \(O(n\log n\log V)\)。
43 CF2246F
倒着做维护一个排好序的后缀 \(1,2,\cdots,x\) 即可。\(n\) 为偶数且逆序对个数是奇数时无解。
44 CF2176F
\(\omega(xy)=\omega(x)+\omega(y)-\omega(\gcd(x,y))\)。
45 P16192
按照 \(j-i\) 从小到大依次反转每条边 \((i,j)\),和之前存在的限制若不构成环则求出一个 DAG 拓扑序并询问,从而可以在 \(\dfrac{n(n-1)}{2}\) 次询问内求出所有限制的边。
求出 DAG 边后,问题变为对 DAG 求拓扑序使得 \(1,2,3,\cdots,n\) 的点上的值构成的序列字典序最小/大。
对于最小,将图取反跑拓扑排序,每次在度数为 \(0\) 的点中选最大的,赋值按照 \(n\) 到 \(1\)。对于最大,则是原图上拓扑序,每次选最大的并从 \(1\) 开始赋值。
46 核桃模拟赛 T1
对于每个 \(x\) 找最小的 \(y\geq x\) 使得存在策略每次结果都在 \([x,y]\) 内,维护连续段,贡献不难计算,复杂度 \(O(n\alpha(n))\) 或 \(O(n \log n)\)。
47 核桃模拟赛 T2
详细揭秘没有脑子怎么做。
从 \(1\) 到 \(n\),每次选一个最小的符合条件的交换到第 \(i\) 个位置,要求是换过来后包含这个位置的 LIS 不超过原来的,且这个位置是后缀中没被删的前缀最小值,前缀最小值可以在删数时线段树二分动态维护,LIS 限制相当于前缀不超过这个值的 LIS 加一加上之后开头大于他的 LIS 不超过原来的,之后比它大的 LIS 相当于一个 3-side 矩形内的 LIS,注意到移动过来是前缀最小值所以这个东西的变化相当有限,通过维护连续段即可维护。复杂度 \(O(n \log n)\)。
48 CF2223C
根据 CRT 我们知道方程 \(x \equiv a_1 \pmod {b_1}\) 和 \(x \equiv a_2 \pmod {b_2}\) 可以被合并成 \(x \equiv c \pmod {\mathrm{lcm}(b_1,b_2)}\),所以到达每个点的初始时间 \(t\) 都可以写成 \(t \equiv a_i \pmod {b_i}\) 的形式,但即使如此仍然难以直接考虑询问,原因是叶子节点很多无法逐一判定合法性。
考虑离线将所有询问挂在根上逐步下传,对于目前点 \(u\) 的限制 \(t \equiv a_u \pmod {b_u}\),如果 \(b_u\) 过大或者 \(s_u \mid b_u\),\(s_u\) 表示儿子个数,那么其走向的儿子唯一确定,可以直接向下传,否则新的 \(b\) 为 \(\mathrm{lcm}(b_u,s_u)\) 至少翻倍,所以只会进行 \(O(\log V)\) 次,总复杂度 \(O(n \log^2 V)\) 或者 \(O(n \log V)\)。
还有一个方法是对树重剖后维护每条重链上点的限制然后二分第一次离开链的位置。
49 CF2223D
考虑 \(p_i \geq a_i\),将 \(a\) 从小到大排序得到顺序 \(c_1,c_2,\cdots,c_n\) 满足 \(a_{c_i} \leq a_{c_{i+1}}\),然后令 \(p_{c_i}=i\),如果此时存在 \(p_i<a_i\) 就已经无解了。
否则构成若干置换环,从小到大枚举每个 \(i\) 判定 \(i,i+1\) 是否处于同一个置换环,若不处于则尝试交换前驱,最后判定一次即可,不难说明正确性,因为若换不了前驱则 \([1,i]\) 前缀和 \([i+1,n]\) 后缀必须完全分开,必然无解。复杂度 \(O(n \alpha(n))\)。
50 IMO 2026 P1
\(1.\) 证明:
注意到 \(\gcd(a,b)\times \dfrac{\mathrm{lcm}(a,b)}{\gcd(a,b)}=\mathrm{lcm}(a,b)\),所以一次操作 \(a,b\rightarrow \gcd(a,b),\dfrac{\mathrm{lcm}(a,b)}{\gcd(a,b)}\) 后,\(\prod \limits_{i=1}^n A_i\) 不变当且仅当 \(\gcd(a,b)=1\),否则 \(\prod \limits_{i=1}^n A_i\) 必定变小。而 \(\gcd(a,b)=1\) 时,\(a,b\rightarrow 1,ab\),记 \(S=(\prod \limits_{i=1}^n A_i,\sum \limits_{i=1}^n [A_i=1])\),注意到每次操作要么二元组第一项变小,要么二元组第二项变大,而前者至少为 \(1\),后者至多为 \(n\),有限次操作后过程必定停止。\(\square\)
\(2.\)
我们说明无论如何操作,最终剩下的唯一一个大于 \(1\) 的数必定为 \(\prod \limits_{p \in \mathbb{P}} p^{\gcd(v_p(A_1),v_p(A_2),\cdots,v_p(A_n))}\),这里 \(\gcd(0,0,0,\cdots,0)=0\)。
显然每个质数幂次独立,对于质数 \(p\) 设 \(B_i = v_p(A_i)\),则每次操作相当于选 \(i,j\),然后 \(B_i,B_j \rightarrow \min\{B_i,B_j\},\max\{B_i,B_j\}-\min\{B_i,B_j\}\)。根据辗转相除可知 \(\gcd(B_1,B_2,\cdots,B_n)\) 在操作过程中始终保持不变,而最终恰存在一个 \(i\) 使得 \(B_i>0\),故其等于原来的所有 \(B\) 的 \(\gcd\)。
51 CF2245F
注意到限制相当于每个前缀 \([1,i)\) 的比 \(a_i\) 大的后缀最小值个数。这个结构显然是区间 DP。对于区间 \([l,r]\) 钦定最小的点为 \(x\in [l,r]\),那么右侧相当于没有多的限制,左侧限制后缀最小值个数,所以多加一维 \(f_{l,r,c}\) 表示区间 \([l,r]\),后缀最小值个数为 \(c\) 的方案数即可转移。注意到 \(\sum a_i = O(n)\) 所以总复杂度 \(O(n^3)\) 而不是 \(O(n^4)\)。

浙公网安备 33010602011771号