9 月做题记录

1 炼石 NOIP R2T1

不讲。

2 炼石 NOIP R2T2

\(f_{i,j,0/1}\) 表示,\(i\) 子树内选点,相邻点数最大为 \(j\),点 \(i\) 是否取到这个 \(j\) 时的方案数。转移容易背包,复杂度 \(O(n^3)\)

3 炼石 NOIP R2T3

\(a_0,a_{n-1}\),全局最小最大值,肯定删不掉。

找到最靠左的最值和最靠右的最值,问题变为两段前后缀。

这个编点 DP 就是 \(O(\dfrac{n^3}{w})\) 的。

4 炼石 NOIP R2T4

有一堆基于分治或者并查集的结构做法,我赛时也写的这种东西,但是太不优美了。

放权多也太牛逼了我草。

注意到,网格图是平面图。

根据平面图欧拉公式,我们知道连通平面图满足 \(|V|-|E|+|F|=2\)。最外面的那个面忽略不算,有 \(|V|-|E|+|F|=1\)。连通块个数等于,\(\sum |V|-|E|+|F|\)

\(\sum |V|\)\(\sum |E|\) 都直接做。否则一个内部的面肯定是一个 \(0\) 的八连通块,或者为空。这都是好处理的,复杂度是 \(O(nm)\) 的。

5 CF2063F2

建树出来,答案显然是每个点对应区间长度除去儿子区间长度的卡特兰数。

对于动态问题,倒着做,每次删点把儿子和父亲合并就行。

6 P6775

\(m \geq n-1\) 时,我们可以证明必然有解。具体来说,考虑 \(m=n-1\) 时,归纳证明正确性。每次取任意两个和 \(\geq k\) 的一个把其中一个删去即可归纳到 \(n' = n - 1\)\(m' = m - 1\) 的情况。\(m > n-1\) 类似。

\(m=n-2\) 时,注意到 \(n-m\) 变化量至多为 \(1\),不难推出,若存在一个集合 \(|S|=x\)\(\sum \limits_{i\in S} d_i = (x-1)k\) 有解,否则无解。充分性可以归纳,必要性不难证明。背包即可。

7 P10070

\(k=1\) 显然。

\(k=3\) 时,我们可以证明必然存在一种方法访问所有点。将问题变为从根开始每次访问距离 \(\leq k\) 的点。我们可以归纳证明对于任意一个树,存在一种方案使得可以从根开始访问所有点并回到一个距离根不超过 \(1\) 的点。对着这个构造即可。

\(k=2\),编个关于子树的 DP 就行。每个子树有若干种状态,分别是是否开始要求必选,是否要求回到根,回到根时是否要求其被选。都是不难转移的。

8 NFLS 模拟赛 T2

限制等价于,\(\forall i \in [l,r], p_i \geq x\),且 \(p^{-1}_x \in [l,r]\)

据此可以求出 \(c_i\) 表示 \(p_i \geq c_i\),从小到大确定每个数的位置即可。

9 CF2077D

枚举最大值 \(x\),要求 \(\sum s_i > 2x\)

从前往后二分一个区间表示目前能最晚取的数在哪,对于固定的 \(x\) 可以做到 \(O(n \log n)\),总复杂度 \(O(n^2 \log n)\)

注意到对于目前枚举的最大值 \(x\),不可能存在最优解使得最大值 \(y \in (\dfrac{x}{2},x]\),原因是此时将 \(x\) 加入这个序列中,原限制仍然满足。

根据这个,显然只有 \(O(\log V)\) 个可行的最大值,每个做一次就好,复杂度 \(O(n \log n \log V)\)

10 CF2128F

肯定是选一条路径,上面都是 \(l\),其他都是 \(r\)

对于一条 \(1\)\(n\) 不经过 \(k\) 的路径 \(P\)\(P\) 上边权都是 \(l\)\(P\) 外边权都是 \(r\)

我们难以限制 \(P\) 是最短路,但是只要我们能保证 \(P\) 能比任意一条经过 \(k\) 的优,就必然能保证 \(k\) 不在最短路上。

一条路径 \(P\) 合法当且仅当 \(\forall u, v \in P,dis_1(u,v)<dis_2(u,k)+dis_2(v,k)\)\(dis_1\) 表示这条路径上的边权和,\(dis_2\) 表示所有边都是 \(r\) 时两点最短路。

考虑对于目前的路径最后一个点 \(x\) 向后加一个点 \((v,l)\),则要求 \(\forall u \in P,dis_1(u,x)+l < dis2(u,k)+dis2(v,k)\)。移项可得 \(dis2(u,k)-dis1(u,x)>l-dis2(v,k)\)。故在扩展路径时,我们希望 \(dis2(u,k)-dis1(u,x)\) 最小值最大。类似 Dijkstra 每次取最小值最大的松弛即可。复杂度 \(O(n \log n)\)

11 CF2125F

首先,\([0,\lfloor\dfrac{n}{6}\rfloor]\) 内的任意一种出现次数都可以达到,所以最多的符合条件区间数量容易差分求出。

直接 DP 是 \(O(n^2)\) 的,不难注意到有 \(j\) 个 docker 时的最小修改次数关于 \(j\) 是凸函数,且谷底确定,就是原串 docker 子串个数,故只需要求至多两个位置的函数值,wqs 二分即可。复杂度 \(O(n \log n)\)

12 CF2056F2

首先,确定出现次数集合 \((s_1,s_2,\cdots,s_k)\) 后,方案数是 \(\dbinom{n}{s_1,s_2,\cdots,s_k}\)。根据 Lucas 定理,其模 \(2\)\(1\) 等价于 \(s_1,s_2,\cdots,s_k\) 构成了 \(n\) 的一个二进制划分。

故我们只关心 \(n\)\(1\) 的个数,记为 \(c\)

进一步,我们还发现,由于出现次数是 \(n\) 的二进制划分,最大值的出现次数至少占了一半,故中位数就是最大值。

枚举最大值 \(x\),在模 \(2\) 意义下计算方案数。方案数为 \(\sum \limits_{i=1}^c \begin{Bmatrix} c\\i\end{Bmatrix}\dbinom{x}{i-1}\)

首先要求 \(i-1 \subseteq x\)。而第二类斯特林数奇偶性是一个经典问题,将其递推式按照 \(m\)\(2\) 分类讨论可以转化为格路计数,进一步转化为组合数奇偶性问题。

\(m\) 不大直接做即可。另一方面注意到,取最小的 \(k\) 使得 \(2^k>c\),则 \(x\)\(x+2^k\) 方案数相同。故只枚举 \([0,2^k)\) 中的 \(x\),只需要计算等差数列异或和。这里的等差数列有特殊性质,将末尾 \(k\) 位删去后变为 \(1,2,\cdots,l\) 的前缀异或,这是经典问题了,按 \(l \bmod 4\) 分类讨论即可。

复杂度 \(O(3^c)\)\(O(c2^c)\),后者需要高维前缀和。

13 CF2127H

注意到 \(K_4\) 中每个点存在包含其的六元环,所以原图是广义串并联图。

剩下的随便做。缩点过程中状态记录对应簇中上下界点连了多少条边,转移是简单的。复杂度线性。

14 NFLS 模拟赛 T2

注意到每个点最短路总长很小。

先做整除分块预处理出 DAG 上有意义的边。每次更新一个点的 \(f\) 时暴力松弛后继。跑的飞快。

15 NFLS 模拟赛 T3

\(k=1\)\(k=2\) 很平凡,略去。

\(k=3\),经典转化成选三个点,求方案数的和。

这样选的三个点中,只有形如:

.X.
X..
..X

是相对困难的。

这个的做法是,考虑从左向右扫描线,我们希望做的是,维护 \(a,b\),遇到上述最左侧点时,令 \(a_x \gets x\),遇到第二个点,将下方所有 \(b_x \gets b_x + a_xk\),第三个点时算上面的点贡献和就行。

16 CF2077E

每次操作可以选择若干位置减 \(1\),满足相邻奇偶性不同。

这是一个最小路径覆盖的模型。拆点建二分图,左侧每个点 \(i\) 向右侧 \(j < i\)\(i,j\) 奇偶性不同的 \(j\) 连边。答案是 \(\sum a_i\) 减最大匹配。

考虑 Hall 定理推论,最大匹配等于 \(\sum a_i - \max \limits_{S} \{|S| - |N(S)|\}\)。所以答案就等于 \(\max \limits_{S} \{|S| - |N(S)|\}\)

显然我们只关心 \(S\) 中最大的奇数和偶数,假设分别为 \(x,y\),其中 \(x<y\),则 \(N(S)\) 包含 \([1,x)\) 所有数以及 \([x,y)\) 中与 \(y\) 奇偶性不同的数。

\(b_i = b_{i-1}+(-1)^ia_i\),把式子写出来就能知道区间 \([l,r]\) 答案是 \(\max \limits_{i=l-1}^r b_i - \min \limits_{i=l-1}^r b_i\),直接做就好。

17 CF2124G

之前做过,没写代码,再做一次。

只能操作一次,所以 \(a_i\) 是前缀最小值,\(a_j\) 是后缀最大值。

枚举 \(i\),考虑 \([1,i)\) 中的最小值 \(a_x\)。若 \(a_i + a_j > a_x\),则我们不关心 \(a_j\) 具体是多少,而只希望 \(j\) 尽量大。而 \(a_i+a_j \leq a_x\) 时,枚举 \(a_i + a_j = k\),即可求出对应的最大的 \(j\)。由于值域线性,我们得到了 \(O(n)\) 个有意义的 \((i,j)\),计算贡献是简单的。

18 P9331

任意时刻能到的是一个区间,所以要求就是能到 \(1\) 且能到 \(n\)

这个东西是一个有向图,\(i\)\([l_i,r_i]\) 连边。对于每个 \(i\),要找 \(i\)\(1\)\(n\) 的两条路径最小化路径并集大小。

观察路径形态,两条路径的 LCP 之后必然没有交点。设 LCP 最后一个点为 \(x\),对于每个 \(x\) 求到 \(1,n\) 最短路大小和,然后从多个点开始做最短路即可。

线段树优化建图,跑 01 BFS 可以做到 \(O(n \log n)\)

对于起点有权值的 01 BFS,仿照一般的 01 BFS,每个时刻队列中有两种权值分别为 \(x\)\(x+1\),按照 \(x\) 从小到大做即可。

19 P11392

看起来就像是支配对。

注意到对于 \(i,j\),如果存在 \(i<x<j\)\(a_x \geq \min(a_i,a_j)\),则替换成 \(x\) 显然不劣。这样的 \((i,j)\) 只有 \(O(n)\) 个。

然后对询问左端点扫描线,扫到 \(l\) 时加入 \(i=l\) 的支配对,有贡献的 \(k\) 是一段后缀 \([s,n]\)。所以要维护的是 \(b_k\) 表示 \(k\) 的答案,对于 \(k \geq s\)\(b_k \gets \max(b_k,a_k+v)\),询问区间 \(b\) 最大值。这是容易线段树维护的。

20 P3688

容易观察出,这段代码在维护单点修改后缀查询。

所以区间 \([l,r]\) 结果正确当且仅当 \(a_{l-1}=a_r\)

对于第 \(i\) 个询问二元对 \((x_i,y_i)\),动态维护 \(p_i\) 表示 \(a_{x_i}=a_{y_i}\) 的概率。

每次修改 \([l,r]\) 对某个 \(p_i\) 的影响需要分类讨论 \([l,r]\)\((x_i,y_i)\) 关系,每一类都是 \(p \gets kp+b\) 的形式。树套树或者 KD-Tree 都能做矩形修改。CDQ 分治显然也能做。

21 P7214

这个题,太厉害了。

这个模型看起来完全无法刻画啊?尝试将时间轴和序列轴在二维平面上刻画。则一个区间覆盖本质上是一个等腰三角形。

考虑把覆盖所有点进行分层,先选一个 \(l=1\) 的区间 \([l,r]\),然后考虑另一个区间 \([l',r']\) 满足 \(l' \leq r+1\)\(r' > r\),然后若可行则将这个三角形拼起来得到一个新前缀 \([1,r']\)。任意一个时间我们都有一个待扩展的前缀 \([1,r]\),当 \(r=n\) 时停止。

将每个三元组 \((l_i,r_i,t_i)\) 视作一个点,点 \(i\) 向点 \(j\) 有连边当且仅当 \([1,r_i]\) 能在后面拼接上 \([l_j,r_j]\)。这等价于 \(r_i - l_j + 1 \geq |t_i-t_j|\)。而答案则是从任意 \(l_i=1\) 的点出发,到达任意一个 \(r_i=n\) 的点的点权最短路最小值。

\(t\) 排序后可以主席树优化建图之类的,但其实没有必要显式优化建图。这个图的特殊性质是要求的为点权最短路,每个点只会被松弛一次,维护对于 \(t\) 的线段树,在线段树上递归松弛就行了。复杂度 \(O(n \log n)\)

22 CF1270H

首先注意到每个连通块都是区间。

所以即求有多少 \(i\) 满足 \([1,i]\)\((i,n]\) 没有连边。即 \(\min \limits_{j=1}^i a_j > \max \limits_{j=i+1}^n a_j\)

这里有一个奇妙转化。我们考虑 \(\max \limits_{j=i+1}^n a_j = k\),将 \(\leq k\) 的视为 \(0\),大于 \(k\) 视为 \(1\),由于元素两两不同,序列是 \(111\cdots1000\cdots 0\) 的形态。我们只需要求有多少 \(k\) 使得 \(k\) 在序列中出现过,且 \(k\) 对应的 \(01\) 序列恰有一个相邻的 \(10\)。这是很容易线段树维护的。

23 CF2077F

有解当且仅当 \(a=b\) 或存在 \(i\neq j\) 使得 \(b_i \subseteq b_j\),必要性显然,充分性先考虑 \(n=2\)\(n>2\) 时先把 \(i,j\) 之外的归位后做 \(n=2\) 就行。

考虑非平凡情况,即 \(b_i \subseteq b_j\)。枚举操作后 \(b_i = S\),考虑某个 \(S \subseteq b_j = T\)。记 \(f_S\)\(\min \limits_{i \in B, i\leq S} \{S -i\}\)。如果原序列 \([S,T]\) 中存在某个其他数,则贡献是 \(f_S+f_T\)。否则记次小值为 \(g_S\),贡献是 \(f_S+g_T\)

枚举 \(S\) 后找到后继 \(x\),分为 \(T \geq x\)\(T <x\) 考虑。\(T<x\) 相当于求 \(g\) 的超集 \(\min\)\(T \geq x\) 时枚举 \(T,x\) 的二进制 LCP 将问题变为求 \(f\) 的超集 \(\min\)。直接做就行,复杂度 \(O(n+m \log m)\)

24 CF843D

当最短路最大值不超过 \(v\) 时,我们有 \(O(v+n+m)\) 的算法。Dijkstra 时枚举权值从 \(1\)\(v\) 以代替堆。

对于原题,维护 \(dis_i\) 表示最短路。每次将 \(c\) 条边边权增加 \(1\),考虑每个 \(dis_i\) 增量 \(\Delta_i\)\(\Delta_i\) 求解过程显然是一个最短路长度不超过 \(c\) 的问题,按照上述做法维护即可。复杂度 \(O(m \log m + q(n+m)+\sum c)\)

25 炼石 NOIP R3T1

不讲。

26 炼石 NOIP R3T2

不讲。

27 炼石 NOIP R3T3

记 LIS 长度为 \(x\),LDS 长度为 \(y\),答案要么是 \(x+y\),要么是 \(x+y-1\),取决于能否分别取出没有交的一个 LIS 和 LDS。

\(f_i\) 表示有多少 LIS 包含 \(i\)。注意到若一个 LDS 序列 \(c_1,c_2,\cdots,c_k\) 与任意一个 LIS 均有交,那么 \(\sum f_{c_i}\) 恰好等于 LIS 个数,因为每个 LIS 和 LDS 最多只有一个交点。

\(f\) 是容易求的。我们只需要求两个 \(\sum f_{c_i}\) 不同的 LDS 即可,这个也是容易求出的,数据结构优化转移时维护一下即可。

由于 LIS 个数太多,计数时对 \(p\) 取模,错误率不超过 \(\dfrac{1}{p}\)

28 炼石 NOIP R3T4

平衡树板子。

29 NFLS 模拟赛 T3

注意到数 \(x\) 在一次操作内被修改的概率为 \(\dfrac{\mathrm{lowbit}(x)}{n}\),考虑对每种 \(\mathrm{lowbit}\) 单独计算贡献。

\(f_{i,j}\) 表示操作 \(i\) 次,这个数的 \(j\) 次方的期望。直接转移是二项式展开,所以考虑 EGF \(F_i(x) = \sum \limits_{j=0}^k \dfrac{f_{i,j}x^j}{j!}\),即求 \([x^k]F_1(x)^m\)。直接做就行。\(F_1(x)\) 的各项系数是自然数幂和的形式,拉格朗日插值或考虑 \(i^k = \sum \limits_{j=1}^k \dbinom{i}{j}j!\begin{Bmatrix} k\\ j\end{Bmatrix}\) 然后先枚举 \(j\) 就行。

30 NFLS 模拟赛 T4

在每个串末尾加个特殊字符,使得没有两个串有前后缀的关系。

一个最大的排列必须是 Trie 树上的一个 DFS 序。

从后往前考虑每个限制,要求就是对 \(u_i,v_i\) 路径上非叶子节点,钦定了一个向儿子走的顺序。可能形如走了 \(a\) 儿子后紧接着走 \(b\),以及首先走 \(a\),或最后走 \(a\)

在压缩 Trie 树,即删去仅有一个儿子的点的 Trie 上,对每个点维护链表就行。注意到压缩 Trie 上两点距离是 \(O(\sqrt{ \sum |S_i|})\) 的,直接维护即可。

31 核桃 NOI 模拟赛 T2

\(x,y\) 分开,问题变为数轴上给若干区间,每个区间你可以选择其或其补集,问所有交集的最大值。

考虑枚举 \(i\),要求交集包含 \(i\),则对于任意区间 \([l,r]\),若 \(i \in [l,r]\),其只能选本身,否则其必须选补集。将 \(i\) 从小往大扫维护线段树就行。

32 NFLS 模拟赛 T2

将物品分为两人同时喜欢,A 喜欢,B 喜欢,都不喜欢四类。

枚举第一类选 \(x\) 个,第二类和第三类都至少选 \(k-x\) 个,问题变为第四类与第二三类两个后缀的并的前 \(k\) 小和,线段树维护即可。

33 NFLS 模拟赛 T3

建立 KMP 自动机,容易处理出 \(f_{i,j,0/1}\) 表示 \([1,i]\) 已经确定,目前匹配的前缀为 \(j\),是否匹配过,后面的方案数。询问直接从前往后钦定每个问号的值,复杂度 \(O(nq)\)

注意到一个有 \(x\) 个问号的串若有解,则至少有 \(10^{x-m}\) 种方案。

故只需要考虑末尾 \(O(m+\log V)\) 个问号即可。

34 NFLS 模拟赛 T4

在数轴上考虑这个问题,假设所有数小到大排序,不妨考虑 \(a_1\)\(a_n\) 先访问。

这个问题等价于在数轴上移动,有若干限制要求某个点比另一个点先访问,求访问所有点的最小距离和。

枚举起点 \(s\) 和终点 \(t\),由于 \(1\) 先访问,所以正向限制都没有用,反向限制可以视为若干区间。我们断言最优解不存在区间 \([l,r]\) 使得 \(s \in (l,r)\)\(t \in (l,r)\),否则可以调整 \(s\) 更后或 \(t\) 更前。

所以确定 \(s,t\) 对应的花费需要考虑 \([l,r] \subseteq [1,s]\)\([l,r] \subseteq [t,n]\)\([l,r] \subseteq [s,t]\)。前两类贡献是 \(0\),最后一类的并集贡献是 \(2\),加上原来的 \(a_n - a_1\) 以及 \(s\)\(1\)\(n\)\(t\) 的距离,即为答案下界。枚举 \(s,t\) 过程很容易优化到 \(O(n \log n)\) 或以下的。

下界可以取到。构造方式是,从 \(s\)\(1\)\(t\)\(n\) 的部分,将所有 \([l,r] \subseteq [1,s]\)\([l,r] \subseteq [t,n]\) 的干掉。然后考虑所有 \([l,r] \subseteq [s,t]\),这些区间并构成若干连续段。从前往后依次加数,遇到连续段 \([l,r]\) 时先访问 \(r\),然后逆序访问 \([l,r)\) 中所有 \(\leq m\) 的,正序访问 \([l,r)\) 中大于 \(m\) 的即可。

我写了,92 分,不知道哪挂了。

35 CF1906K

即求 \([x^0]\prod (1+2x^{S_i})\)

考虑写成 FWT 形式,\([x^k]\mathrm{FWT}\left(\prod (1+2x^{S_i})\right) = \prod (1+2\times (-1)^{|k\cap S_i|})\)

对于每个 \(k\),记 \(c_0\) 表示 \(2 \mid |k \cap S_i|\)\(i\) 数量,\(c_1\) 反之。\(c_0+c_1=n\)\(c_0-c_1\) 可以 FWT 求出,故 \(c_0,c_1\) 唯一确定。求出 \([x^k]\mathrm{FWT}\left(\prod (1+2x^{S_i})\right)\) 后 IFWT 既可。复杂度 \(O(V \log V + n)\)

36 CF2096H

即求 \([x^k]\prod \limits_{i=1}^n \sum \limits_{j=l_i}^{r_i} x^j\)

FWT 意义下,即求 \([x^k]\mathrm{FWT}\left(\prod \limits_{i=1}^n \sum \limits_{j=l_i}^{r_i} x^j\right) = \prod \limits_{i=1}^n \sum \limits_{j=l_i}^{r_i} (-1)^{|k \land j|}\)

区间和的形式可以差分,所以考虑 \(l_i=0\) 时怎么做,即求 \(\prod \limits_{i=1}^n \sum \limits_{j=0}^{r_i} (-1)^{|k \land j|}\)

考虑 \(\sum \limits_{i=0}^r (-1)^{|k \land i|}\)。这里有一个重要观察是,对于任意偶数 \(c > 0\)\(\sum \limits_{i=0}^{c\times \mathrm{lowbit}(k)-1} (-1)^{|k \land i|}=0\)。其原因是,考虑任意 \(i\)\(i \oplus \mathrm{lowbit}(k)\),不难发现两者的 \((-1)^{|k \land i|}\) 互为相反数,且均不超过 \(c\times \mathrm{lowbit}(k)-1\)

\(c=\lfloor\dfrac{r}{2 \times \mathrm{lowbit}(k)}\rfloor\),则 \(\sum \limits_{i=0}^r (-1)^{|k \land i|}\) 可以改写为 \(\sum \limits_{i=2c \times \mathrm{lowbit}(k)}^r (-1)^{|k\land i|}\)。将 \(\mathrm{lowbit(k)}\) 和前面的位分开,\((-1)^{|k \land i|}=(-1)^{|\lfloor\frac{i}{2\times \mathrm{lowbit}(k)}\rfloor\land \lfloor\frac{k}{2\times \mathrm{lowbit}(k)}\rfloor|} \times (-1)^{|i \land \mathrm{lowbit}(k)|}\)。故 \(\sum \limits_{i=2c \times \mathrm{lowbit}(k)}^r (-1)^{|k\land i|} = \sum \limits_{i=2c \times \mathrm{lowbit}(k)}^r (-1)^{|c \land \lfloor\frac{k}{2\times \mathrm{lowbit(k)}}\rfloor|} \times (-1)^{|i \land \mathrm{lowbit}(k)|}\)。注意到 \((-1)^{|i \land \mathrm{lowbit}(k)|}\) 只关心 \(\mathrm{lowbit(k)}\) 以及后面的位。所以原式等于 \((-1)^{|c \land \lfloor\frac{k}{2\times \mathrm{lowbit(k)}}\rfloor|} \times \sum \limits_{i=0}^{r\bmod (2\times \mathrm{lowbit}(k))} (-1)^{|i \land \mathrm{lowbit}(k)|}\)

注意到 \(c\)\(\mathrm{lowbit}(k)\) 固定时只和 \(r\) 有关,整个式子中,\(\mathrm{lowbit}(k)\) 确定时,\(k\) 不同只会导致前面的 \(\lfloor\dfrac{k}{2\times \mathrm{lowbit(k)}}\rfloor\) 有所不同。考虑对于每种不同的 \(\mathrm{lowbit}(k)\) 求出对应的所有 \(k\)\(x^k\) 系数。对于固定的 \(\mathrm{lowbit}(k)\),式子的后面关于 \(r\) 是定值,不妨记作 \(a_i\)。对于每个 \(x\),计算 \(f_x=\prod (-1)^{|c_i\land x|}a_i\),则 \([x^k]\) 对应即为 \(f_{\lfloor \frac{k}{2\times \mathrm{lowbit}(k)}\rfloor}\)

原问题还有 \(l_i\),故记 \(b_i\)\(l_i-1\) 对应的后面那个式子,\(d_i\)\(l_i-1\) 对应的上述的 \(c\)。则 \(f_k = \prod \left((-1)^{|c_i\land k|}a_i - (-1)^{|d_i \land k|}b_i\right)\)。注意到这个形式等于 \([x^k]\mathrm{FWT}(\prod (a_ix^{c_i}-b_ix^{d_i}))\),即等于 \([x^k]\mathrm{FWT}(\prod (x^{d_i}(a_ix^{c_i \oplus d_i}-b_i)))=[x^k]\mathrm{FWT}(\prod x^{d_i}\prod (a_ix^{c_i \oplus d_i}-b_i))\),前部分 FWT 容易计算。对于后半部分,本质即求形如 \([x^k]\mathrm{FWT}(\prod a_ix^{b_i}+c_i)\) 的式子,也就是求 \(\prod ((-1)^{|k \land b_i|}a_i+c_i)\)。类似 FWT,在分治过程中维护对应的结果即可。

注意到对于每种 \(\mathrm{lowbit(k)} = x\),只需要做 \(2^{m-x}\) 的 FWT,所以总复杂度还是 \(O(m2^m)\) 的。

37 ARC181E

这个很难想到啊。

我们声称对于连通图,若有解,其对应的树唯一确定。考虑令 \(a_i = 100^i\),对于每条边 \(u<v\),设其边权为 \(a_v-a_u\)。则若存在解,解必然是此图的唯一一个最小生成树。原因是考虑每条非树边 \(u<v\),则树路径上每个点 \(w\) 必然都有 \(w\leq v\),否则若 \(w>v\),就存在一条比 \((u,v)\) 边权更大的树上边,与 MST 矛盾。

事实上我们大可以取 \(u,v\) 边权为 \(v(n+1)-u\),这样自然也满足上述限制。我们知道这样的 MST 对于 \(u,v\) 满足路径上每个点 \(\leq v\),但没有限制其 \(\geq u\)。考虑反过来取边权,就能保证 \(\geq u\)。而事实上有解等价于这两棵 MST 选的边集相同,这是因为若有解则解唯一。

对于删边问题,是经典的删边 MST,对边集的维护容易异或哈希维护。复杂度 \(O(n \log n \alpha(n))\)

38 CF2041N

想想三种 MST 算法哪种能做。

考虑 Boruvka。

有一个很厉害的分析,我也不知道怎么想出来的。具体来说,只考虑 Boruvka 的第一轮,我们对每个点求出其邻边最小值。将原序列按 \(a\) 排序后,划分为前 \(\sqrt m\) 个和后面的所有。

假设 \(n,m\) 同阶。对于前面的 \(\sqrt n\) 个点,我们不关心其最小邻边在哪里。对于后面的所有点,若其最小邻边不在前 \(\sqrt n\) 个点内,则其在原图上至少被 ban 掉了 \(\sqrt n\) 个点。这样的点最多只有 \(O(\sqrt n)\) 个。对每个连通块钦定代表元,则其要么为前 \(\sqrt n\) 中的一个,要么是后面至多 \(O(\sqrt n)\) 次非平凡情况所得。所以一轮下来只剩 \(O(\sqrt n)\) 个连通块了。如果不要求删掉每个点的答案,对这 \(O(\sqrt n)\) 个点,\(O(n)\) 条边的图跑 Prim 就是 \(O(n)\) 的。

现在考虑删点。注意到删去 \(u\) 时,若原图存在一个 MST 使得 \(u\) 为叶子,则答案容易计算。考虑 Boruvka 第一轮的过程。一个点在第一轮结束后不是叶子,当且仅当其属于前 \(\sqrt n\) 个点或属于后缀至多 \(O(\sqrt n)\) 个非平凡点。所以这个森林至多只有 \(O(\sqrt n)\) 个非叶子。之后 Prim 过程显然也只会增加 \(O(\sqrt n)\) 条边,故非叶子数量不超过 \(O(\sqrt n)\),对每个叶子重新跑一次即可。复杂度 \(O(n \sqrt n)\)

39 ARC165F

\(a_i,b_i\) 分别表示 \(i\) 的第一次和第二次出现位置。

注意到若对于 \(i,j\)\(a_i<a_j\)\(b_i<b_j\),即出现形如 \(0011\)\(0101\),则要求最小答案的情况下,最终形态只能是 \(0011\),故建有向边 \(i \rightarrow j\)。问题即求最小拓扑序。

直接做主席树或者 CDQ 优化建图就行,但没必要。对于目前弹出的点 \((i,j)\),按 \(i\) 这一维建线段树维护 \(j\) 的最大值就能不显式建图的同时做到 \(O(n)\) 空间和 \(O(n \log n)\) 时间。

40 炼石 NOIP R4T1

枚举最大值以及包含其的可行区间。根据笛卡尔树启发式合并即可分析出复杂度 \(O(n \log n)\)

41 炼石 NOIP R4T2

维护最小值指针。如果最小值变小则另外开一个表示下次从这个位置开始枚举。复杂度 \(O(n+V)\)

42 炼石 NOIP R4T3

\(k=n-m\)

一个做法是缺一分治,bitset 优化,复杂度 \(O(\dfrac{nk\log k}{w})\)

还有一个做法,考虑 \(\bmod p\) 意义下对每个 \(i\) 计算 \(\dfrac{\prod (1+x^{s_j})}{1+x^{s_i}}\)。显然只有 \(O(\sqrt n)\) 个本质不同 \(s_i\),直接做就是 \(O(nk+n\sqrt n)\) 的。

43 炼石 NOIP R4T4

离线下来换根直接维护。反正就是分类讨论一下每个点的贡献,总而言之都可以树剖维护是两个 \(\log\) 的,过了。\(1\)\(\log\) 也可以做到。

44 ARC205E

直接从前往后加入,前 \(10\) 位枚举子集,后 \(10\) 位枚举超集,就是 \(O(n \sqrt V)\) 的。

好像还能更优的,观虫我就行了。

45 NFLS 模拟赛 T2

\(x\) 个位置 \(c_1,c_2,\cdots,c_x\),使得其和 \(\in [l,r]\),显然对应答案是 \(\sum [c_i > x]\)

枚举一个前缀 \([1,y]\),尝试计算选 \(y\) 个数使得 \(y\geq x\),并将答案对 \((x,n]\) 中选的数个数取 \(\min\),故记 \(f_{i,s}\)\(g_{i,s}\) 分别表示前缀最多选多少数和为 \(s\) 以及后缀最少选多少数和为 \(s\),单调队列优化中间的枚举,复杂度 \(O(n^2)\)

46 NFLS 模拟赛 T3

常见的树上哈密顿回路结构,考虑钦定一个叶子做为根,然后考虑子树 DP。每个子树的根为 \(u\)\(u\) 和父亲边权为 \(w\),则子树内总共进出了 \(\dfrac{w}{2}\) 次。\(f_u\) 表示对应的子树内方案数。转移直接树上背包合并,直接做是 \(O(n^3)\) 的,瓶颈在于 \(O(n)\) 合并子树。

考虑优化。注意到对儿子合并的本质是,有 \(w_1,w_2,\cdots,w_k\) 个颜色为 \(1,2,\cdots,k\) 的段,要将他们随意拼接并分为新的 \(\dfrac{w}{2}\) 段,且每段内相邻两个小段颜色不同。容斥即可。DP 新增子树时枚举这个子树钦定了多少连续段就行。复杂度 \(O(n^2)\)

47 AGC070C

神奇反射容斥。

\(f(a,b,k)\) 表示 \((0,0)\)\((a,b)\),有 \(k\) 个空格可以插入,忽略 \(y=x+1\) 限制的方案数,这很容易求。

直接反射容斥,答案就是 \(f(a,b,n-a-b) - f(a+1,b-1,n-a-b)\)。很快啊!写完发现样例都过不了。

为啥呢。考虑反射容斥是将起点第一次触碰到 \(y=x+1\) 时的路径翻转,这会导致翻转的那一条相邻两个是否相同的状态改变。

那就考虑进一步把这个东西细化一下,分类讨论第一次遇到 \(y=x+1\) 时,是否立即在后面加了一个空格,如果加了则对应 \(f(a+1,b-1,n-a-b-1)\),如果没加则强制要求其下一步向右走,把这一步手动扔掉就行。最终式子是 \(f(a,b,n-a-b)-f(a+1,b-1,n-a-b-1)-f(a,b-1,n-a-b)-f(a,b-1,n-a-b-1)\)。复杂度线性。

48 NFLS 模拟赛 T1

众所周知,冒泡排序执行轮数等于 \(\max \limits_{i} \sum \limits_{j < i} [p_j>p_i]\)。原因是你考虑对一个数 \(x\) 把值域拆成 \(01\),如果值域只有 \(01\) 则你可以发现轮数是除了最后一个后缀外 \(1\) 的总数。那么相当于找到 \(p_i=x\),将 \(>x\) 看作 \(1\) 小于等于 \(x\) 看作 \(0\),这个 \(01\) 序列的轮数至少是 \([1,i)\) 中大于 \(p_i\) 数的个数。显然这样确实能取到答案。

考虑将 \(p\) 翻转,对应答案就是 \(\max \limits_{i} \sum \limits_{j>i} [p_i>p_j]\)。对于取到 \(\max\) 的位置 \(i\),显然 \(p_i\) 是前缀最大值,此时这个值就变成了 \(p_i-i\)。且若不为前缀最大值,\(p_i - i\) 只会比原式小。故只需要对于所有排列 \(p\),求 \(\max \limits_{i} \{p_i-i\}\) 的和即可。

枚举 \(d\),计算 \(\exists i, p_i-i \geq d\) 的方案数。即用 \(n!\) 减去 \(\forall i, p_i-i<d\) 的方案数。要求 \(p_i<d+i\),对于一段前缀,\(p_i\) 上界从 \(d\) 不断变为 \(n\),从前往后,每个位置 \(i\) 的方案数即为 \(d\),而后缀有长度阶乘的方案数,直接计算即可。复杂度 \(O(n \log n)\),瓶颈在于快速幂。

49 NFLS 模拟赛 T2

DP 写出来就是 \(f_u \gets \min \limits_{(u,v)\in E} g_v+1\)\(g_u \gets \max \limits_{(u,v)\in E} f_u+1\)

按值域从小到大尝试求出 \(f,g\),对于一个 \(i\),若 \(g_i\) 已求出,则可以在反图中直接更新其出边的 \(f\)。而对于 \(i\),若 \(f_i\) 求出,未必能更新反图出边的 \(g\)。通过 \(i \rightarrow j\) 更新 \(g_j\) 后,当且仅当 \(g_j\) 的所有入边都被更新过了,\(g_j\) 才能更新之后的答案,这是因为若存在入边的 \(f\) 还未求出,则必然比这个点的 \(g\) 大。仿照 Dijkstra 的过程,对 \(f,g\) 维护两个堆,每次取较小的扩展即可。复杂度 \(O(n \log n)\)

50 NFLS 模拟赛 T3

炼石 NOIP R3T3,额外要求构造方案,做法是一样的。

51 NFLS 模拟赛 T4

尝试双指针,问题在于最优化背包不能做删除,而双指针过程要求在线,不是很能直接考虑线段树分治的结构。形如 Baka's Trick 或者猫树的结构也做不了,因为你要求所有位置的 DP 值的和,而背包合并是 \((\max,+)\) 卷积,这也没法做啊?

对于这种没办法撤销的,对于每个 \(l\) 求一个 \(r_i\)\(r\) 单调的,考虑 CF1386C。具体来讲就是整体二分,对于分治区间 \([l,r]\),答案区间 \([L,R]\),我们只需要在 \(O(V(r-l+R-L))\) 复杂度内做出来,总复杂度就是 \(O(nV\log n)\) 的。但不同于 CF1386C,对于 \(mid=\dfrac{l+r}{2}\) 计算答案时,显然不能直接从 \(L\) 开始扫,原因是我们不仅需要区间内信息,还需要前后缀信息。但有一个退而求其次的很聪明的做法,对于 \(mid\) 计算答案时,直接进行二分。对于目前二分的区间 \([a,b]\),取 \(mid\) 出来,注意到要么 \([a,mid]\) 的状态唯一确定,要么 \([mid,b]\) 信息唯一确定,这样背包加入次数还是 \(O(R-L+r-l)\) 的。递归到儿子时维护一下背包支持撤销就行了。复杂度 \(O(nV\log n)\)

所以为什么 \(10^7\)\(\log\) 跑得飞快。

52 QOJ9492

显然无法 polylog,第一时间考虑根号算法。

首先把链加链求和变成到根操作。

对第二棵树做树分块,每个关键点与其祖先上第一个关键点之间的路径称为一条重要路径。显然一次询问相当于 \(O(\sqrt n)\) 条关键路径查询与 \(O(\sqrt n)\) 次单点查询。

总共只有 \(O(\sqrt n)\) 条关键路径,对每条关键路径,预处理第一棵树上每条到根链与这条路径编号的交集大小,即可在修改时 \(O(1)\) 查询第一棵树的一个到根链对第二棵树上的任意一个关键路径的贡献。这部分复杂度是 \(O(n\sqrt n)\) 的。

单点查询部分,DFS 序分块即可均摊到 \(O(\sqrt n)-O(1)\)

这样做空间也是 \(O(n\sqrt n)\) 的,写得好就能过了。离线下来每条关键路径单独做就是线性空间的。

53 某个洛谷网校模拟赛题

题是我偷的,我也不知道链接。

题意:给定 \(n\)\(n\) 个数 \(a_1,\cdots,a_n\)\(n\leq 2^{19}\)\(0\leq a_i < 2^{19}\),考虑完全图,\(i,j\) 边权是 \(\mathrm{popcount}(a_i \oplus a_j)\),求 MST。

考虑 Prim,这个算法过程是要对每个点 \(u\) 维护距离目前已选连通块的最小边权,记作 \(dis_u\)

考虑每次加入一个 \(x\) 进入连通块怎么动态 \(dis\)。这是熟知的,查询 \(\min \limits_{i \in S} \mathrm{popcount}(i \oplus j)\),此事在梦熊 NOIP 十三连测以及百度之星第二轮亦有记载,方法是直接广搜,每个 \(u\) 最多入队 \(O(\log V)\) 次,复杂度 \(O(V \log^2 V)\)

54 P6109

\(x\) 轴分治,每次计算区间内,跨越 \(mid\) 的所有询问的答案。

将一个这样的矩形拆成左右两边关于 \(mid\) 的 3-side 矩形查询,而 3-side 矩形查询可以扫描线的时候维护历史信息。往两侧递归时把包含两侧的修改预先传进去,类似线段树分治的过程。

55 P4278

有一个做法是外层重量平衡树内层权值线段树,查询时一起二分,平衡树 pushup 时线段树合并,这就是 \(O(n \log^2 n)\) 的。

还有一个想法是外层权值线段树,查询时直接在权值线段树上二分,于是我们需要在平衡树上递归插入查询,此时要维护序列动态加点,比较两个数先后关系。一个直接的做法是平衡树上查 rank,这样就是 \(O(n \log^3 n)\) 了,不过外层维护重标号就行了。具体来说维护一棵重量平衡树,每个点上写一个区间 \([l,r]\),令这个点权为 \(mid\),然后左右两侧递归下去。只要保证树高 \(O(\log n)\) 就不会导致精度问题。这样比较相对关系只需要比较点权,写个替罪羊应该就可以。

56 P6783

\(r\) 扫描线,问题变为矩形覆盖,查询最后一次修改时间 \(\geq l\) 的点权和。

在 K-D Tree 上维护这一信息,每个点维护一个子树修改的标记。覆盖时把子树内标记回收就行。势能分析得到复杂度 \(O(n \sqrt n)\),弄个分块均摊后面的复杂度即可。

57 QOJ8781

思路新颖。

看起来不是很有复杂度很优的算法。考虑能不能 bitset。

\(b_i\)\(j>i\)\(p_j > p_i\)\(j\) 的集合。则对于一个区间 \([l,r]\),另一个可行的区间的开头即为 \(\bigcap \limits_{i=l}^r b_i-(i-l)\),集合减数表示每个数减去对应数。

然而不能直接枚举每个 \(i,j\),因为求交没办法进行逆运算,显然无法维护。

考虑将序列按 \(m\) 分块,每个关键点 \(k\times m\) 处开始维护块内前缀后缀的集合交,这样就可以直接进行查询了。复杂度 \(O(\dfrac{n^2}{w})\)

58 QOJ8787

每次选一个哈密顿路径将其删去,做 \(k\) 次。自行生成数据不难看出这样做的正确性。

求一个哈密顿路径直接套用 UOJ554 就能过。不用写 LCT。

59 炼石 NOIP R5T1

显然等价于只有两个数,初始时一个是 \(1\),另一个是 \(n-1\),每次带权随机一个数加 \(1\),问那个值总和期望。

枚举 \(i\) 表示进行了 \(i\) 轮,然后枚举 \(j\) 表示第一个数现在变成了 \(j\),计算方案数。把 \(a,b\) 带权随机看作有 \(a\) 种方案选 \(1\)\(b\) 种方案选 \(2\),这个式子表示出来是一个组合数乘以上升幂的结构。这个式子容易前缀和优化,复杂度就是 \(O(\sum n + \sum m)\) 的。

60 炼石 NOIP R5T2

后缀数据结构好像可以简单维护这个结构,不过有点难了。

考虑一个前缀的出现次数,等于 Fail 树上子树大小。

从前往后插入就是支持动态加叶子,查询子树大小。LCT 拍上去就过了吧。

但我不会写 LCT。考虑阉割版 ETT,即直接用平衡树维护入栈出栈序,很容易的。复杂度 \(O(n \log n)\)

61 QOJ8522

保序回归,整体二分后,问题变为每个位置要么选 \(x\) 要么选 \(x+1\),要求选 \(x+1\) 是一个左上轮廓,最小化花费。这个容易线段树优化 DP 的,复杂度 \(O(n \log^2 n)\)

62 QOJ8521

首先可以看出,只需要统计 \(k=O(\log n)\) 左右的 \(S_k\) 就能计算答案。

考虑 \(S_k=S_{k-1}+S_{k-2}\) 时,需要什么信息才能合并。答案串跨过这两部分时,我们需要统计 \(S_{k-1}\) 的一个后缀与输入串 \(T\) 能匹配多少,以及 \(S_{k-2}\) 的一个前缀与输入串能匹配的最长后缀。所以要维护这个信息。维护这个信息只需要进一步维护,每个 \(S_k\)\(T\) 的前后缀匹配的最长长度就行。复杂度是 \(O(n \log n)\) 或者 \(O(n \log^2 n)\)

63 PJUDGE 21861

注意到对于每一位,当且仅当在区间 \([l,r]\) 内所有数相同才会产生贡献,然后直接维护就行。

64 PJUDGE 21862

注意到 \(\max x - \min x\) 显然是任取两个 \(x\),一个贡献是 \(+1\),另一个贡献是 \(-1\) 时,贡献的最大值。

于是有一个 \(O(nk)\) 的 DP,\(f_{i,j,S}\) 表示 \([1,i]\) 中的点,选了 \(j\) 个,目前 \(x\)\(y\) 的总共 \(4\)\(+1,-1\) 是否选了的情况下,最大权值。

注意到一个选法的 \(\min x, \max x, \min y, \max y\) 只和最多 \(4\) 个点有关。故若 \(k\geq 5\),必然有一个点不对上述贡献产生影响,不如其直接改为 \(c\) 最大的那个。所以问题等价于 \(k\leq 4\),然后做上面的 DP 就行了。

65 PJUDGE 21863

积水总量是 \(\sum \limits_{i=1}^n \min(\max \limits_{j=1}^i a_j, \max \limits_{j=i+1}^n a_j) - a_i\)

从前往后 DP,但是不方便确定后缀最大值。如果提前钦定后缀最大值,则状态需要选的个数,前缀,后缀最大值三维,复杂度是 \(O(nk^3)\) 的,不是很优。

进一步,考虑操作后 \(a\) 的最大值处,发现前后是独立的。故枚举 \(i\) 表示操作后最大值位置,那么前后缀的 DP 都只关心前后缀最大值,复杂度 \(O(nk^2)\)

66 炼石 NOIP R5T3

\(k=2\) 时,注意到 \([0,2^x)\) 的串是 \([0,2^{x-1})\) 复制一份然后 flip 得到的,然后每个 \([l_i,r_i]\) 可以表示为若干 \([0,2^x)\) 串拼接,这玩意 AC 自动机上倍增做一下就行了。

为了求每个节点被访问次数,考虑这个东西是一个 DAG 转移结构,所以倍增过程可以同时维护出现次数。

\(k>2\) 结构是一样的,纯纯 dirty work。

67 PJUDGE 21864

\(r_i\) 表示 \(A\)\(i\) 行的和,\(c_i\) 表示 \(A\)\(i\) 列的和,首先要满足 \(\sum r_i = \sum c_i\),事实上这个是充要条件。注意到此时令前 \(n-1\)\(m-1\) 列的 \(A\) 都为 \(0\),最后一列除了 \(A_{n,m}\) 赋值为对应行的和,最后一行除了 \(A_{n,m}\) 赋值为对应列的和。\(A_{n,m}\) 赋值为 \(c_m - \sum \limits_{i=1}^{n-1} r_i\)。不难验证正确性。

然后目标变为求 \((r_1,r_2,\cdots,r_n),(c_1,c_2,\cdots,c_m)\),满足 \(\sum r = \sum c\),且 \(\forall 1\leq i\leq n, 1 \leq j \leq m,C_{i,j}=|r_i-c_j|\)

\(C_{x,y}\) 为所有 \(C\) 中最大值。则可以注意到 \(r_x\)\(r\) 中最大值且 \(c_y\)\(c\) 中最小值,或者相对的。考虑 \(r_x\)\(r\) 中最大值的情况。不妨假设 \(c_y = 0\),且 \(r\) 都非负,此时可以唯一确定 \(r\),从而可以确定每个 \(c\) 的至多两个取值。而为了满足 \(\sum r = \sum c\)\(c_y\) 不一定等于 \(0\),所以我们可以将所有 \(x,y\) 都增加 \(1\),此时 \(\sum r - \sum c\) 会增加 \(n-m\)。所以相当于每个 \(c\) 选两个值之一,要求 \(\bmod (n-m)\) 的意义下等于某个值。这个是模意义背包,直接做是 \(O(n^2)\) 的。但是 \(n=m\) 时,压根没法调整,这个时候要做值域 \(O(nV)\) 的背包,bitset 优化即可,复杂度 \(O(\dfrac{nV^2}{w})\)

68 QOJ6119

首先左括号少就在后面加左括号,右括号少就在前面加右括号,不可能加更多的,没有意义。

于是考虑左右括号相同的情况。令左括号权值为 \(-1\),右括号权值为 \(1\),答案等于 \(\sum \max(0,\lceil \dfrac{s_i}{2} \rceil)\)\(s_i\) 是前缀和,证明显然。

这个东西很容易分块维护,复杂度 \(O(n\sqrt n)\)

69 NFLS 模拟赛 T1

考虑每个 \(i\) 的最终变化量 \(\Delta_i = |a_i-b_i|\),我们可以证明不同的 \(i\) 之间互不影响。原因是显然这个移动过程如果某个时刻不满足上升的性质,可以调整成矛盾的那个位置先移动,总而言之每一位独立。

然后就是直接贪心,一个增量 \(\Delta\) 若总共进行了 \(k\) 次操作,则显然只有 \(\lfloor \dfrac{\Delta}{k} \rfloor\)\(\lceil \dfrac{\Delta}{k} \rceil\) 两种取值,然后维护个堆维护贡献减少量,每次贪心取最大的即可。

70 NFLS 模拟赛 T2

分块过了,不牛。

线段树做法和分块一样的,每个点维护所有六种可能的置换情况下,所有三种进入的,出来是什么。标记也是一个置换,下传是标记复合。

71 NFLS 模拟赛 T3

不用带任何脑子。

直接的想法是枚举 \(L \cap R\) 的集合划分然后跑 MST,复杂度显然不对。

注意到求新的 MST 只需要把 \(L \cap R\) 部分的点在原来 MST 上建虚树,把边权赋值为路径 \(\max\),重新跑一次就行。

72 NFLS 模拟赛 T4

考虑固定第二类人中使用第二类机器的方案,则有解等价于对于任意一个时段 \([i,i+1)\),记 \(c\) 表示剩下的人中时间段经过这个时段的人的个数。则要求 \(c \leq x\)

即对于每个 \([i,i+1)\),我们记 \(a\) 为原来第一类人经过其数量,\(b\) 为第二类的,记 \(c\) 为第二类有多少人使用了第二类机器经过其。则要求 \(a+b-c\leq x\),故 \(c \geq a+b-x\),则 \(y-c\leq x+y-a-b\)

这等价于这个时段至多保留 \(x+y-a-b\) 个第二类机器。对此考虑按照时间轴建网络流,\(i\rightarrow i+1\),容量为 \(x+y-a-b\),表示这个时刻最多还剩这么多。对于每个第二类的 \([l_i,r_i]\),连边 \(l_i\rightarrow r_i\),容量为 \(1\),表示使用了第二类机器。跑最大流即可。构造容易贪心维护。

73 洛谷模拟赛 R5T4

题意:

有一颗 \(n\) 个点的树,每条边有边权。定义两个点 \(i,j\) 配对的代价为 \(i,j\) 之间路径边权和。

对于一个长度为偶数的区间 \([l,r]\),你需要把编号在 \([l,r]\) 内的点两两配对,并最小化这些点配对的代价之和。定义这个区间 \([l,r]\) 的权值就是将 \(l,l+1,\cdots,r\) 两两配对的最小代价和。

你需要求出所有长度为偶数的区间的权值之和对 \(2^{32}\) 取模的值。

做法:

对于一个点集 \(S\),其两两匹配的最小代价和等于所有边的权值和,要求这条边断开后两部分点数都是奇数。答案显然大于等于这个,容易归纳证明可以取到。

然后线段树合并维护一下子树信息就行了。

74 QOJ10063

\(c_i\) 表示第 \(i\) 条边出现次数,则要求 \(c_i > 0\),且每个点的邻边 \(c\) 和为偶数,最小化 \(\sum c_i\times w_i\)

对于原网格图,注意到除了在四条边界上且不为顶点的点的度数为奇数外,其他点度数都是偶数。问题直接被转化为将这样的点两两匹配,两个点之间边权为最短路,求一般图最小权完美匹配。

注意到匹配的路径有交可调整,所以将这样的点黑白顺次染色,边只会在不同颜色之间连。这样转化为二分图,跑费用流就过了。写 SPFA,理论复杂度是 \(O(n^4+n^3 \log n)\) 的,但跑的飞快。写真正的最小权完美匹配就是 \(O(n^3\log n)\) 的。

我写了过了。偷看了一下另一个 submission 的做法,注意到由于路径不交,这个最小权匹配可以直接区间 DP 的,虽然跑的还没费用流快。

75 QOJ6125

首先容易计算出模 \(10^9+7\) 意义下每个子树的权值和的 \(k\) 次方。

注意到 \(10^9+7=2\times 500000003+1\),而 \(500000003\) 为质数。考虑方程 \(x^k \equiv y \pmod p\) 的非平凡情况 \(y \neq 0\)。若 \(\gcd(k,p-1)=1\),则 \(k\) 在模 \(p-1\) 意义下有逆元,两边同时取 \(k^{-1}\) 次幂得 \(x\equiv y^{k^{-1}} \bmod p\)。故 \(\gcd(k,p-1)=1\) 时解存在且唯一确定。

本题中,只要 \(k \neq 500000003\),问题直接解决。\(k=500000003\) 时,注意到 \(x^{2k} = x^{p-1} \equiv 1 \pmod p\),故 \(x^k \equiv 1 \pmod p\)\(x^k \equiv -1 \pmod p\),然后对根和儿子的子树权值和 \(k\) 次方分类讨论即可。具体怎么分类讨论我其实也没看懂。

76 GZOI D1T1

考虑每个 \(i\) 成为严格前缀最小值时,哪些 \(x\) 合法。显然是一段区间 \([l_i,r_i]\) 容易解出。离散化后做区间加就行了。

77 GZOI D1T2

直接背包是 \(f_i\) 表示凑出 \(i\) 的方案数。转移是 \(f_{i+w} \gets f_i\),然后和 \(k\)\(\min\)。复杂度 \(O(n^2V)\)

只考虑所有 \(f_i > 0, f_{i+w} < k\) 的转移,显然只有 \(O(knV)\) 个。只要能定位出来就做完了。

这是 bitset 直接做,复杂度 \(O(knV+\dfrac{n^2V}{w})\)

78 GZOI D1T3

树剖平衡树维护板子。

但是 std 写 \(2\)\(\log\) 跑得飞快就把时限压到 \(4\) 秒吗?全场就没人卡过去了。

79 GZOI D1T4

不是题。

\(p_i\) 表示 \([1,i]\)\(i\) 结尾最长 LIS 长度,\(q_i\) 表示后缀的。按照 \(p\) 分层。一个 LIS \(x_1,x_2,\cdots,x_l\) 必然满足 \(\forall 1 \leq i < l\)\(p_{x_{i+1}}=p_{x_i}+1\),充分必要。

直接做是对层内所有点状压跑 DP,过不去,点数太多了。

注意一个点 \(i\) 包含在某个 LIS 内至少要满足 \(p_i+q_i-1=l\),对这些点记状压然后转移是高维前缀和。讲题人说同层只有不超过 \(20\) 个点,出题人会证明同层期望只有 \(O(n^{\frac{1}{6}})\) 个点,这都是题吗。

80 P3773

\(\dbinom{a}{b} \equiv 1 \pmod 2 \iff b \subseteq a\)\(\subseteq\) 是二进制子集包含。

直接从前往后 DP 做就是 \(O(3^{\log_2{a}})\) 的,但远不仅于此。注意到问题就是单点加超集求和,前半后半分开就可以直接做,还可以观虫我呢。

81 GZOI D2T1

等价于中间没有连着的两个 \(0\),直接做就行。

82 GZOI D2T2

DP,\(f_{i,j,k,0/1/2}\) 表示长度为 \(i\) 序列末尾为 \(j\),贪心策略分了 \(k\) 段,最后一段上升,下降,还是未确定。前缀和优化转移即可。复杂度 \(O(nmk)\)

83 GZOI D2T3

模拟 Trie 树上移动过程,发现可以维护只在每个叶子到根路径上的点子树内走最终走到的位置,以及权值和,然后就做完了。复杂度 \(O(n\log^2 V)\)

84 GZOI D2T4

【模板】虚树。

85 QOJ10058

直接 DP 是 \(O(n^2)\) 的,形如 \(f_{i,j,0/1/2/3}\) 表示 \([1,i]\)\(j\) 个变量为真,末尾两个是什么的方案数。

\(f_{j,0/1/2/3}(i)\) 看作形式幂集数,转移是乘以一个单项式的形式,由于有 \(4\) 维状态所以分治 NTT 时做矩阵乘法就行。对吗。

86 QOJ9907

对于每一种 \(a\),保留的肯定形如 \(11\cdots100\cdots0\) 的结构,记 \(1\)\(-1\)\(0\)\(+1\),则保留的是 \(-1\) 且是严格前缀最小值的位置,以及是 \(+1\) 且是严格后缀最大值的位置。

对于每种 \(a\) 维护这些位置,插入删除只会影响 \(O(1)\) 个位置,全局匹配只需要再开一棵线段树就好。

87 NFLS 模拟赛 T1

二分答案 \(x\),双方任意时刻位置都要满足 \(s+t\leq x\)。注意到贪心策略是,固定 \(t\) 不动,每次选一个最小的 \(s'\),使得 \(s\) 移动到 \(s'\) 过程中始终能保持 \(s+t \leq x\),要求 \(s'<s\),然后反着对 \(t\) 也做交替做。某个时刻都卡住了就不行了。

注意到 \(s,t\) 在进行移动时,\(s\) 能访问的点要满足 \(s'+t \leq x\),而 \(s\) 必定能访问初始时给定的 \(s\),故只关心初始 \(s,t\)\(x\) 限制下移动到哪。复杂度 \(O(n \log n)\)

88 NFLS 模拟赛 T2

\(n\leq 11\) 时需要特判。

\(n>11\) 时,注意到一个 \(>\lfloor \dfrac{n}{3}\rfloor\) 的质数不可能在环上,否则左右两个都得是其倍数。

于是答案上界为 \(n-1-c\)\(c\)\(\lfloor\dfrac{n}{3}\rfloor+1\)\(n\) 之间质数数量。

构造方法是,对于所有 \(\leq \lfloor \dfrac{n}{3}\rfloor\)\(>2\) 的质数 \(p\),依次在环上写 \(2p_1,p_1,3p_1,3p_2,p_2,2p_2\cdots\),然后把所有其他存在 \(\leq \lfloor \dfrac{n}{3} \rfloor\) 的非 \(2\) 质数因子的数插入到对应的 \(p\) 内。\(n\) 足够大时显然每个奇合数都符合条件。然后把剩下的偶数在外围围成一圈即可。如果 \(p\) 数量奇偶性不对,中间补个 \(2,3\) 的公倍数就行了。

89 NFLS 模拟赛 T3

建 Kruskal 重构树,第一问直接算贡献,第二问 DP 一下,都是简单的。

第三问是诈骗。注意到 \(\forall j \in V_i, j \leq i\)。且 \(i \in V_i\)。故不存在 \(S\) 使得 \(\bigoplus \limits_{i \in S} V_i = \varnothing\)。所以 \(f(S)=\bigoplus \limits_{i\in S} V_i\)\(2^n-1\) 个子集的双射,大小为 \(i\) 的子集方案数就是 \(\dbinom{n}{i}\)

直接做就是 \(O(n \log n)\) 的,但是得写一个线性筛预处理 \(i^k\) 不然可能会被卡常。

90 QOJ9906

考虑将 \(a_i\) 改为有多少操作区间 \([l,r]\) 使得 \(i \in [l,r]\),则 \(\prod a_i = \sum \limits_{x_1,x_2,\cdots,x_n} \prod \limits_{j=1}^n [j \in [l_{x_j},l_{x_j}+m-1]]\)

所以 \(\prod a_i\) 的期望就等于 \(\sum \limits_{x_1,x_2,\cdots,x_n} P(\prod \limits_{j=1}^n [j \in [l_{x_j},l_{x_j}+m-1]]=1)\)

确定 \(x_1,\cdots,x_n\) 后,不妨假设有 \(k\) 种本值不同的 \(x\),并将 \(x\) 值域离散化成 \(1\)\(k\),对答案乘以 \(\dbinom{c}{k}\) 即可。对于 \(>k\) 的每个 \(l\),我们不关心其是什么。对于每个 \(\leq k\)\(i\),我们找到最小的 \(a\) 使得 \(x_a=i\) 以及最大的 \(b\) 使得 \(x_b=i\)。要求 \(a \in [l_i,l_i+m-1]\)\(b \in [l_i,l_i+m-1]\),容易解得对应的 \(l\) 的范围与概率。注意到有一个必要要求为 \(b-a+1\leq m\)

据此考虑设计 DP。对于每个前缀 \([1,i]\),我们假设先不关心 \(x\) 具体是多少,而只关心 \(x\) 被划分为了哪些集合。我们要记录 \(j\) 表示目前有多少不同的 \(x\),以及一个集合 \(S\) 表示对于每个 \(j \in [i-m+2,i]\),是否存在某个 \(p\) 使得 \(x_p\) 第一次出现在 \(j\) 且要求其最后一次出现严格大于 \(i\)。加一个数 \(x_{i+1}\) 时考虑其是否是一个新的数,以及若不是,是否为一个结尾的数。状态数 \(O(n^22^m)\),转移 \(O(m)\),复杂度 \(O(n^2m2^m)\)

这个做法在 \(m\) 较大时表现不优。考虑 \(3m>n\) 时,将序列划分为三段,分别是 \([1,m],[m+1,2m]\)\([2m+1,3m]\)。不难注意到所有操作后必然有对于所有 \(1\leq i\leq m\),有 \(a_i+a_{i+m}+a_{i+2m}=c\),原因考察每一次操作影响范围即可。另一方面,我们还知道 \(a_1\leq a_2\leq \cdots \leq a_m\),这是因为选了 \(i(1 \leq i \leq m)\) 就一定会使得 \([i,m]\) 这一段都增加。另一方面我们也有 \(a_{2m+1}\geq a_{2m+2} \geq \cdots \geq a_{3m}\)。原因同理。而事实上这些条件就是充要条件。这是因为你可以直接解出每个位置为开头被加的次数。据此直接进行 DP,\(f_{i,a_i,a_{2m+i}}\) 表示对应答案即可。复杂度 \(O(nc^4)\),据说答案为关于 \(c\)\(n\) 次多项式,所以复杂度是 \(O(n^6)\)

这两种算法分情况执行即可。

91 QOJ9909

可以证明存在一个点使得到其他点最短路最大值不超过 \(2\)

考虑归纳。每次随意选一个点 \(x\),若不存在 \(i \rightarrow x\)\(x\) 即为目标点。否则考虑所有 \(i \rightarrow x\)\(i\) 以及其导出子图,子图中存在一个点 \(z\) 到这些点最短路最大值不超过 \(2\)。而 \(z \rightarrow x\),故 \(z\) 到图中所有点距离不超过 \(2\)

据此设计随机化算法,维护目前导出子图点集 \(S\),并按照上述过程模拟。显然期望不超过 \(2n\) 次,足以通过。

92 NFLS 模拟赛 T1

把问题通过 Dilworth 定理改一下就变成求 LIS 了。

93 NFLS 模拟赛 T2

在前缀和上考虑,等价于前缀和最大值减最小值不超过 \(k\)。枚举最小值后就是两个边界的反射容斥。复杂度 \(O(k\times \dfrac{n}{k}) = O(n)\)

94 NFLS 模拟赛 T3

CDQ 分治优化 DP。虽然看起来分治内层也是三维结构,但是不难看出只要动态维护后缀最大值就能变成二维形式。复杂度 \(O(n \log^2 n)\)

95 NFLS 模拟赛 T4

称病毒为 \(1,2,3\) 类。

确定第 \(3\) 类后,通过每个数次数分别为 \(1,2,4,8,\cdots\) 即可在 \(\lceil \dfrac{n}{8} \rceil = 38\) 次询问内确定每个 \(1,2\) 类到底是 \(1\) 还是 \(2\)

问题变为如何确定所有 \(3\) 类位置。直接二分次数太多了。考虑分块和二分结合。对序列以 \(B=8\) 分块,每个块单独询问一次。若存在 \(3\) 类再对里面二分。然而为了卡进这个次数限制,对于每个块,我们询问的时候也用 \(1,2,4,8,\cdots\) 的形式,这样若一块内有 \(3\) 类,我们可以立即得到其中的 \(2\) 类点。然后我们二分搜索到这个块内第一个 \(3\) 类点,确定其前面的都是 \(1\) 类,其后面都是 \(1\)\(3\) 类。把每块后面的这些都拼接在一起,然后每次取 \(8\) 个拉出来做类似的过程。这样做还卡不进次数,考虑到有些块内没有 \(3\) 类,你需要多花 \(1\) 次询问,但是在二分的时候,你可以把多出来的用来做这个,然后就能做到次数限制内了。

96 QOJ9911

我们声称答案为,删去叶子后得到的树的叶子个数。菊花图除外。

首先我们证明这是答案的下界。具体来说,先考虑给出的第一个拓扑序 \(p_1,p_2,\cdots,p_n\),这相当于告诉我们每个点 \(p_i\) 在以 \(p_1\) 为根的情况下,父亲在 \(p_1,p_2,\cdots,p_{i-1}\) 中。此时考虑每个非根叶子,为了区分其父亲和祖父,必须存在某个给出的拓扑序使得起点在其父亲的子树以内,否则若所有起点都在其父亲子树外,无论如何都无法确定这个点的父亲和祖父的关系。所以点数无论如何不会小于删去所有叶子后剩下的叶子数量。

其次,我们给出一个构造。考虑图中删去叶子后得到的所有剩余叶子 \(x_1,x_2,\cdots,x_k\)。先以 \(x_1\) 为根取一个 DFS 序,对于每个点优先访问其在原树上是叶子的儿子。我们注意到对于任意一个点 \(u\),若存在其子树内的某个点为开头的拓扑序,则这个点的父亲通过信息唯一确定。现在只需要考虑所有原树上的叶子节点。对于 \(x_2,x_3,\cdots,x_k\),均以其出发构造 DFS 序,访问邻居时按照 \(x_1\) 开头得到的 DFN 编号倒着访问即可。不难发现每个叶子都成功区分了其父亲祖父和兄弟。

97 QOJ9913

将整个数轴上的操作看成一棵二叉树。每个叶子表示一个空段。从前往后操作时,会把一个叶子拆成两个儿子。

考虑对这个结构进行 DP。对于每个集合判定其是否可以成为最终被放入的集合。记 \(f_{S}\) 表示 \(S\) 这内部的点构成了一个子树,其占据的空间最大是多少。则显然其能占据的空间为 \([w_S,f_S]\) 中任意数,\(w_S\)\(\sum \limits_{i\in S} a_i\)

考虑转移。显然 \(S\) 子树的根就是 \(S\) 中最小值 \(x\),然后考虑划分 \(S \setminus \{x\}\) 给左右子树,转移是 \(f_S \gets f_{ls}+f_{rs}\)。为了满足原来 \(\bar{S}\) 不能选,要求对于任意 \(y \in \bar{S} < x\),有 \(a_y > f_{S}\),而 \(y > x\) 的限制都在其两子树内分别符合了限制。最终要求 \(f_{S} \geq m\) 才合法。

分析复杂度不难得到 \(O(4^n)\)

98 QOJ9914

对于每个 \(i\) 询问 \(\{1,2,3\cdots,n\}\setminus \{i\}\),即可得到删去 \(i\) 后最大连通块大小。从而你可以确定重心!

进一步,记 \(i\) 的点权为上述的这个值。将所有点按照点权从小到大排序后依次尝试加入目前的 \(S\),若加入后返回值大于 \(1\) 则撤销,最终得到了一个独立集。而由于重心的这个性质,你得到的是这棵树的一个黑白染色。

\(S\) 为黑点,\(T\) 为白点。我们希望确定所有 \(S,T\) 之间的连边。为此考虑递归。每次将 \(T\) 分半变为 \(T_0\)\(T_1\),可以确定 \(S\) 内每个点与 \(T_0,T_1\) 两个集合的哪些有连边。递归 \((S_0,T_0)\)\((S_1,T_1)\) 即可。分析次数。\(S\) 内每个点的所有邻边会构成在递归树上的叶子到根路径并上进行贡献,而 \(\sum |T|\) 显然是 \(O(n \log n)\) 的。所以总次数也是 \(O(n \log n)\) 的。注意一下实现常数即可通过。

99 QOJ10299

注意到 \([l_1,r_1]\) 被分成了若干段,具体来说记 \(x_i\) 表示第一个串中 \(i\) 的配对点。则分段形如 \([l_1,x_{l_1}],[x_{l_1}+1,x_{x_{l_1}+1}],\cdots\)。对于每一段,其会依次匹配第二个串中 \([l_2,r_2]\) 部分的一些串。

对于每个 \(i \in [1,n]\)\(A_i\) 为左括号的 \(i\),以及所有 \(j \in [1,m]\)\(B_j\) 为左括号的 \(j\),预处理出 \(f_{i,j}\) 表示 \(A[i,x_i]\)\(B[j,m]\) 能匹配的最长前缀。如果能处理出来则询问直接跳就行了。

考虑如何求 \(f_{i,j}\)。分类讨论 \((i,x_i)\) 这一对括号是否保留。若不保留,则相当于 \([i+1,j-1]\) 分为若干段去匹配 \(B[j,m]\),这部分直接暴力跳段即可。不难看出每段只会被访问一次,复杂度是 \(O(n^2)\) 的。另一方面,若 \((i,x_i)\) 括号保留,则要求其必须匹配 \(B\) 中的 \((j,x_j)\),并且中间这一段可以完全匹配。这个东西本质和询问时跳跃是一样的,所以直接跳就行,复杂度和之前分析也是一样的。视 \(n,m,q\) 同阶,复杂度 \(O(n^2)\)

100 炼石 NOIP R7T1

按照 \(a_i-i\) 排序后不难发现每个连通块是一个区间,求有多少 \(i\) 使得 \([1,i]\)\([i+1,n]\) 完全断开即可。

101 炼石 NOIP R7T2

谴责 weak sample。

显然 \(s_1\) 确定了后面都确定了。每个串 \(s_i\) 的限制是一段前缀为某个串重排后的结果。每次往前做,如果遇到一个长度比前缀小的就能递归到一个新前缀。这是取模所以只会发生 \(\log\) 次,复杂度是对的。

102 炼石 NOIP R7T3

oeis。

103 炼石 NOIP R7T4

谴责 weak sample。只有一个 \(5\times 10^4\) 的大样例还是菊花。

先三度化,仿照动态重心的点分树做法,每次往较大的子树跳就行。复杂度 \(O(n\log^2 n)\)

104 QOJ10300

不难发现对于固定的 \(x\),每个 \(y\) 对应答案 \(f(y)\) 构成了分段一次函数。

线段树合并维护分段函数的一次项与常数项系数即可。复杂度 \(O(n \log^2 n)\)

105 QOJ10302

先忽略 \(i,j,k\) 不同的限制,相同的容斥掉就行。

枚举 \(i\),限制 \(b_j \leq a_i\)\(a_k \geq b_i\)\(a_j \geq b_k\)。按 \(a_i\) 从小到大的顺序枚举,动态加入所有 \(j\),然后每次加入 \(j\) 时将所有 \(b_k \leq a_j\)\(k\) 点权加 \(1\),查询即询问 \(a_k \geq b_i\) 的点权和。KDT 维护即可。复杂度 \(O(n\sqrt n)\)。卡不过去,憋笑。

106 QOJ10304

考虑 \(q=p^{-1}\),则一个子排列数组即为 \(q\) 中的一个值域连续的前缀。

\(s_i\) 表示 \([1,i]\) 初始时有多少值域连续的前缀,则交换 \(i<j\) 会失去 \(s_{j-1}-s_{i-1}\) 个这样的前缀。另一方面,对于每个前缀,在值域上其构成若干区间,显然只有 \(O(1)\)\((i,j)\) 使得交换后值域连续。故把这些位置找出来单独计算即可。\(s_{j-1}-s_{i-1}\) 部分是差卷积,FFT 即可。复杂度 \(O((n+q)\log n)\)

107 QOJ10306

我们声称一个序列的最大权独立集权值等于总和一半,当且仅当令 \(s_0=0\)\(s_i = a_i - s_{i-1}\) 后,\(s_n=0\)\(\forall 1 \leq i \leq n, a_i \geq 0\)

据此设计 DP,\(f_{i,S}\) 表示长度为 \(i\) 的前缀,所有有意义的 \([j,i]\) 目前的 \(s\) 构成的集合为 \(S\)。直接转移是 \(O(nm2^m)\) 的,容易优化转移形式做到 \(O(n2^m)\)

108 NFLS 模拟赛 T1

一个人 \(i\) 能被唯一确定当且仅当不存在 \(j\neq i\) 满足 \(i,j\) 在所有演出的是否出现状态完全相同。

据此直接整体二分,哈希维护即可。复杂度 \(O(n\log n)\)

109 NFLS 模拟赛 T2

对着 DP 一下就行了,思路很自然的。

110 NFLS 模拟赛 T3

只要能解出 \(p,q\),两边同时取 \(c^{-1} \pmod {(p-1)(q-1)}\) 次幂即可。

\(p\) 随机时且 \(q\) 就是下一个质数,枚举 \(\sqrt n\) 附近的 \(p\) 即可。

难点是 \(p,q\) 不随机,现在限制是 \(p\in [10^9,2\times 10^9]\)\(q -p=\lambda\leq 3\times 10^5\)。注意到 \((p+q)^2=p^2+q^2+2pq\geq 2\sqrt{p^2q^2}+2pq=4pq=4n\),另一方面,\((p+q)^2=(q-p)^2+4pq\leq \lambda^2+4n\)

所以 \(2\sqrt n \leq p + q \leq \sqrt{\lambda^2+4n}\),不难发现这个范围内根本就没几个数,枚举 \(p+q=d\) 后解方程就行。

111 QOJ3144

每个点拆成三个点分别表示目前处于踢球,或处于带球的状态。跑最短路就行。

112 QOJ1131

很清新的题。

所有字符看成 \(0,1,2\) 考虑,注意到 \(a,b\) 操作后得到的就是 \(2(a+b) \bmod 3\),所以能生成的串总能表示为 \(xA+yB+zC\) 的形式,其中 \(x,y,z \in [0,2]\)。实际上只有 \(9\) 种可能的 \(x,y,z\),即只有 \(9\) 种能生成的序列。

线段树维护哈希即可。

113 QOJ2766

把直径拉出来分类讨论一下就可以做,好像很难写。

114 QOJ3126

选择一条 \(s\)\(t\) 的最短路和一条 \(u\)\(v\) 的路径,使得 \(u,v\) 路径上不在 \(s,t\) 路径上的边权和最小。

建出最短路 DAG,即从 \(s\) 开始求最短路后保留 \(dis_i+w=dis_j\) 的边。一条 \(u\)\(v\) 的最短路等于 DAG 上 \(u,v\) 间一条路径。不难注意到选取的 \(s,t\) 路径和 \(u,v\) 路径的交是一段连续区间,故枚举区间开头 \(x,y\),要求存在 DAG 上路径 \(s \rightarrow x \rightarrow y \rightarrow t\),即 \(s\) 能到 \(x\)\(x\) 能到 \(y\)\(y\) 能到 \(t\)。拓扑排序时不难维护。复杂度 \(O(n+m\log m)\)

115 QOJ3127

\(a,b,c\) 分别为询问串中 \(0,1\) 与问号的数量。显然有一个 \(O(c2^c)\) 的算法。此外通过预处理高维前后缀和结合容斥容易得到一个 \(O(a2^a)\)\(O(b2^b)\) 的算法。故我们有 \(O(l2^{\frac{l}{3}})\) 的算法,总复杂度 \(O(ql2^{\frac{l}{3}})\),已经可以通过了。写得好一点可以把 \(l\) 去掉。

116 QOJ8258

这个很容易刻画的,考虑 hall 定理就行了。很容易得到一个充要条件,这个结构可以扫描线简单维护的。

117 CF1634E

考虑 \(n_i=2\) 怎么做。对于每个二元组 \((u,v)\),连边 \(u\leftrightarrow v\),必要条件是每个点度数为偶数,即每种数总共出现了偶数次,否则显然无法分成两部分。另一方面,这是充要条件。考虑找一个欧拉回路后,每个点定向的入边数等于出边数,故将每条边 \(u\rightarrow v\) 设置为 \(u\) 在第一个集合内,\(v\) 在第二个集合内即可。

对于 \(n_i > 2\),显然必要条件依然成立。将相邻两个合成一组后容易知道这个条件仍然充分必要,直接仿照 \(n_i=2\) 构造即可。

118 QOJ10740

答案不小于 \(\sum \lceil \dfrac{deg_i}{2} \rceil\),事实上可以取到。

每种颜色的边是一个环或者一条链,所以是欧拉回路状物。原图不存在欧拉回路时,拉一个虚拟源点向所有奇度数点连边。欧拉回路是图的环分解,每个环染不同颜色即可。通过欧拉回路构造环分解只需要从前往后维护一个栈,每次遇到一个环把环上点删去即可。

119 QOJ11115

拆成两个连通块类似双极定向,考虑先建圆方树。

圆方树上如果有一个子树大小 \(\equiv 2 \pmod 3\) 就做完了,否则切开的肯定是某个点双内部。所以这个点双对应的向外的割点可以视为 \(0\)\(1\),然后参考双极定向不难推出一个简单的结论。

120 QOJ8257

太魔怔了。

注意到 \(T \leq 5 \times 10^5\),而若本质不同的坐标数超过 \(1000\),无论如何都不可能在限制内完成,全部输出不行即可。

现在考虑把相同坐标缩在一起,令 \(n\) 为本质不同坐标数,则 \(n\leq 1000\)

注意到行走的过程中,每个坐标的球肯定会在其最后一次被经过时拾取,所以不难证明任意时刻拾取的球都是一段前缀与后缀,原因是如果中间还有一段那么这一段之后还会被经过。

于是整个行走过程可以被分段,任意时刻有一个区间 \([l,r]\) 和目前的位置 \(l\)\(r\),一开始处于 \([1,n],1\)\([1,n],n\),于是考虑 DP,记 \(f_{l,r,0/1}\) 表示目前区间 \([l,r]\),目前位置为 \(l\) 还是 \(r\) 的答案,转移显然。复杂度 \(O(T+q \log n)\)

121 炼石 NOIP R8T1

每次考虑相邻和最大的两个,将较大的删去即可。

122 炼石 NOIP R8T2

倒着从 \(n\)\(1\) DP,状态里记一下导出子图的相关信息即可。

123 炼石 NOIP R8T3

没看懂,明天看看。

124 NFLS 模拟赛 T1

直接做二维数点即可。

125 NFLS 模拟赛 T2

先计算只要求每行不全相同的方案数,减去存在若干列全相同但不存在某行全相同的方案数。后者是简单容斥。复杂度 \(O(n \log n)\)

126 NFLS 模拟赛 T3

枚举一个点 \(s\),维护集合 \(S\),初始 \(S=\{s\}\),每次反转 \(u,v\) 边时,若 \(u,v \in S\)\(u,v \notin S\) 则跳过。否则不妨令 \(u\in S\)\(v \notin S\),将 \(v\) 加入 \(S\) 并将 \(v\)\(S\) 外的边都改成外向即可。若最终 \(S\) 不为全集则输出答案。可以证明总有可行的 \(s\)。复杂度 \(O(n^3)\)

正确性大概是说。考虑这个过程反过来从后往前做,每个点 \(i\) 有一个集合 \(S_i\) 初始有 \(S_i = \{i\}\) 表示哪些点作为 \(s\) 能到点 \(i\)。每次考虑反转边 \(u,v\),本质就是令 \(S_u,S_v \gets S_u \cup S_v\)。最终若所有 \(S_i\) 为全集则上述方案失败。这个问题叫做 The gossip problem,可以证明至少需要 \(2n-4\) 次操作。故 \(m \leq 2n - 14\) 时确实可行。

127 NFLS 模拟赛 T4

\(f_d(z)^2\) 要么为 \(0\) 要么为 \(1\)。令 \(g(x) = \prod (-1)^{k_i}\),则 \(f(a_ia_j)=f(a_ia_j)^2g(a_i)g(a_j)\)

只要能解决对集合 \(S\) 做插入删除维护贡献,套用 Dsu on Tree 即可。

注意到 \(f(a_ia_j)^2 = \sum \limits_{x^{d+1}|a_ia_j} \mu(d)\)

每次向集合内加入 \(x\),增加的贡献为 \(g(x)\sum\limits_{b\in S} g(b)\sum \limits_{y^{d+1}|xb} \mu(y)\)。不难发现要求 \(y|x\),否则 \(b\) 本来就存在幂次大于 \(d\) 的质因子。于是枚举因数即可。总复杂度 \(O(n\log^2n)\)

128 QOJ12043

有结论:冒泡排序进行 \(k\) 轮后,前缀 \([1,x]\) 的数构成的集合为原序列前缀 \([1,\min(n,x+k)]\) 内前 \(x\) 小的数。证明不难归纳。

据此离线做插入查 \(k\) 小和即可,在线主席树也可以做。

129 QOJ7510

考虑每次询问整个点集,把独立集部分删去继续。最终可以将整个点集分解为若干独立集。

对于询问边集,常见做法是考虑整体二分状物。为了求解 \(S,T\) 之间的连边,将 \(S\) 拆一半,对每个 \(T\) 内的点判定其与左半和右半边数即可递归。这里要求 \(S\) 本身是独立集。

这样的总次数应该是 \(\log\) 量级的。

130 QOJ10094

每个时刻确定的是一个区间范围 \([l,r]\),直接做区间 DP 是 \(O(n^2)\) 或以上的,不能接受。

注意到答案不会太大,具体来说一个很松的界是不会超过 \(k \times \lceil \log_2 n \rceil \leq 100\) 的。考虑经典技巧是值域定义域反转。记 \(f_{i,x}\)\(g_{i,x}\) 分别表示最大的 \(j\) 使得确定了范围 \([i,j]\) 且目前在 \(i\),最终花费不超过 \(x\),以及相对应的最小的 \(j\)。转移 \(O(2^k)\) 枚举哪些位钦定相同即可。复杂度 \(O(2^kkn\log n)\),实际上花费上界没有那么大,只有 \(50\) 左右,所以可以轻松通过。

131 NFLS 模拟赛 T1

写一些分讨就行,都是 dirty work。

132 NFLS 模拟赛 T2

注意到答案总是 \(n-1,n\)\(n+1\),注意到 \(n+1\) 的位置类似一个阶梯形传递,分析一下就行了。

133 NFLS 模拟赛 T3

做了一万遍了。

\(3^n\) 做法太蠢了。你按值域插入记录每个前缀的 LIS 就行 \(O(2^n\mathrm{poly}(n))\) 了。

134 QOJ9698

注意到全局 chkmin 先操作 \(x\) 后操作 \(y\),若 \(x>y\)\(x\) 毫无意义。

所以可以视作 chkmin 都是从小往大操作的,每个 chkmax 操作插入在某个 chkmin 之前。则问题等价于对于每个区间 chkmax \((l,r,c)\),选取任意一个 chkmin 的 \(y<c\) 或令 \(y=c\),真正的区间 chkmax 的权值是 \(y\)。然后 chkmin 操作只执行最小的那个,之后执行所有 chkmax。

对于这个问题,考虑先把 chkmin 做了,chkmax 本质等价于值域大到小扫描线的区间覆盖。故考虑 DP,\(f_{l,r,c}\) 表示操作后区间 \([l,r]\) 每个数大于等于 \(c\) 的本质不同序列数。容易做到 \(O(n^5)\),卡一下常就过了。

135 QOJ7993

考虑经典套路:\(|a| = \max(a,-a)\),问题变为给总共 \(2n\)\(a_i,b_i\) 选取符号,要求 \(a\) 中正号数量等于 \(b\) 中负号数量。这还不足以构造出可行的环,若 \(a\) 中正号集合与 \(b\) 中负号集合相同就爆了。这时对这个微调一步就行。

136 炼石 NOIP R9T1

\(\gcd\)\(\operatorname{lcm}\) 分别做莫反,看起来是 \(O(4^{\omega(n)})\),但是实则肯定跑不满,因为一个质因数值数大于等于 \(2\) 时才会有 \(4\) 的贡献。

137 炼石 NOIP R9T2

当长度的排列 \(p_1,p_2,\cdots,p_n\) 确定后,问题变为一个插板,我们只关注 \(\sum \limits_{i=1}^{n-1} \max(p_i,p_{i+1})\)。故问题变为对每个 \(k\) 求有多少长度为 \(n\) 的排列使得 \(\sum \limits_{i=1}^{n-1} \max(p_i,p_{i+1})=k\)。这是简单的连续段 DP。复杂度 \(O(n^4)\)

138 炼石 NOIP R9T3

场上一直在做贪心,但其实全错了。

首先一个重要观察是我们只会在叶子和其邻点的边上做操作。

枚举直径中点。如果在边上则这条边肯定没被操作,中点就是边的中点,是类似的。不妨假设直径中点在点 \(u\) 上。

令直径长度为 \(l\),距离 \(u\) 最远点为 \(t\)。即使 \(u\) 不是直径中点,也存在 \(2t \geq l\)。当且仅当 \(u\) 为中点时取等。我们计算经过 \(k\) 时刻 \(2t\) 的最小值并将答案对其 chkmin,显然会算到正确答案且不会算到更小的结果。

对于 \(k\) 时刻后 \(t\) 的最小值,考虑每个叶子到 \(u\) 距离。不难发现前 \(\sum m-d_i\) 时刻 \(t\) 都可以保持为 \(m\),然后是一个斜率为叶子个数的一次函数。这个东西是容易扫描线的时候维护的。

139 P14012

对于询问树的结构问题,一个常见想法是确定根后依次确定每个点的父亲。

首先令根为 \(1\),不难在 \(O(n \log n)\) 次询问内将所有点按照与根的距离排序,所以你得到了这棵树在以 \(1\) 为根情况下的一个拓扑序,每个点的父亲即为前缀中距离这个点最近的点。

考虑一些简单的交互手法发现不是很能直接做。难点在于考虑直接树分治。每个点度数不超过 \(3\) 意味着直接点分治次数量级就是对的,不过写出来不一定能过,需要卡常。一个更好的做法是边分治,这样常数小可以轻松通过。

140 P10716

等价于询问 \([1,i]\) 有多少个 border 满足其在 \([1,i]\) 中不重叠出现次数至少为 \(k\)

枚举一个前缀 \([1,i]\),其在字符串中不重叠出现了至多 \(\lfloor \dfrac{n}{i} \rfloor\) 次,只需要能确定每次的出现位置即可。询问的时候注意到只需要找到最长的符合条件 border 即可,容易在失配树上倍增。

所以我们只需要快速找一个前缀的不重叠出现位置。这个容易通过在失配树上维护每个子树的信息维护。

总复杂度 \(O((n+q)\log^2 n)\)

141 P13969

这个题的难点在于整个过程相对复杂,不容易用一个简单的模型刻画,从而导致难以进行分析。

观察每个数的移动轨迹。对于第 \(i\) 次操作删去 \(x\),我们将 \(n-i+1\)\(x\) 连边。注意到由于 \(x\) 互不相同,你得到了一个若干环与链的结构。不难通过手玩得到,整个环会被直接消除,一条链等价于把链头的数移动到链尾。

由于链头总在 \([n-k+1,n]\) 内,最终序列有序等价于所有 \(u\rightarrow v\) 其中 \(v < n-k+1\) 的边对应的链头构成的序列最终是有序的。这些 \(v\) 必定构成 \([1,n-k]\) 的一段连续后缀。

枚举后缀长度 \(i\) 后不难计算贡献。答案为 \(\sum \limits_{i=0}^{\min(k,n-k)} \dbinom{k}{i}^2(k-i)!\)

142 P14001

等价于构造完全图 \(K_m\) 上的尽量多的三元环使得任意两个三元环没有公共边。此外可以加上所有 \(i,i,i\) 的结构。

\(m \equiv 1 \pmod 6\)\(m \equiv 3 \pmod 6\) 时是可以构造到每条边都出现的。这个问题是著名的 Steiner 三元系,在 2021 集训队互测 中亦有记载。这个做法应该可以比限制更优,但我不太会。

注意到构造所有 \((i,j,m-i-j)\) 在模 \(m\) 意义下的三元组可以做到恰好和限制相同,于是也可以通过。

143 NFLS 模拟赛 T1

打表题不讲。

144 NFLS 模拟赛 T2

写个 DP。由于 DP 值是单调的所以不难二分优化内层转移。

145 NFLS 模拟赛 T3

线段树优化建图模板。

146 NFLS 模拟赛 T4

我只会带根号的。

对于某个 Subtask,特殊性质是,最多只有 \(8000\) 个位置会变。不妨考虑若有 \(B\) 为位置会变,怎么做。

所有连线分为若干类,分别是两侧都会变,两侧都不会变,和一侧会变。

注意到两侧都会变与一侧会变直接每次做单调栈就行。

对于两侧都不会变的,这样的连线一开始就唯一确定,只需要验证合法性。由于这些合法区间要么不交要么包含,映射到会变的位置上形成 \(O(B)\) 个区间,每次查区间最大值并二分即可。

我写了,卡不过去,有人卡过去了,我也不知道怎么卡。

147 P13920

直接考虑第二类询问,即要求最终成环。

原问题的网格图没啥意义,本质就是给你一个最多 \(2 \times 10^4\) 个点的连通无向图和起点 \(s\),问是否存在一条 \(\leq 10^5\) 的回路,使得每个点被进入的次数为奇数。

\(k\) 为图点数。若 \(2 \mid k\),不难发现有解。对于图上构造,常见想法是考虑 DFS 生成树。对于一个 \(k\) 个点的树,令 \(a_i\) 表示目标状态每个点被进入的次数奇偶性,不难发现只要有 \(2 \mid \sum a_i\) 则必然有解。原因是你 DFS 递归构造,如果奇偶性不对先往父亲走一步再回来。这样只有可能根无法调整,而 \(2 \mid \sum a_i\) 天然保证了根是对的。

\(2 \nmid k\) 时,猜测无解。其实猜错了。如果是树确实无解,但是对于图来说不一定。观察一个三元环,发现绕一圈即可,而任取一棵生成树并不符合条件。注意到若一个图为二分图,那么黑白染色容易证明无解。反之,我们猜测必然有解。任取一个生成树和某条非树边构成的奇环,最终回到根后绕奇环一圈回去就可以把奇偶性调整到对的,即可以做到 \(2 \mid \sum a_i\)

对于第一类询问。\(2 \mid k\) 一样做。\(2 \nmid k\) 时必然有解,任取根的一个儿子,最后往儿子走一步就行。

次数限制很松,正常实现就行。

148 P13536

枚举 \(6\) 种对应方式,只有 \(h_i=k-j,h_j=k-i,h_k=j-i\) 是难的。其他的枚举其中一个别的全都确定了。

枚举 \(j\),限制 \(h_i-i=h_j-j\) 以及 \(h_k+k=h_j+j\)。我们声称枚举满足 \(h_i-i=h_j-j\) 的集合 \(S\)\(h_k+k=h_j+j\) 的集合 \(T\) 中较小的那个,复杂度就是 \(O(n\sqrt n)\) 的。原因是你注意到本质上我们得到了两个 \([1,n]\) 内所有点的划分,满足任意两个集合交不超过 \(1\)。取一个阈值 \(B = \sqrt n\) 就能分析了。

149 NFLS 模拟赛 T1

【模板】单源最短路径。

150 NFLS 模拟赛 T2

这个题难爆了。

注意到每次修改的是第 \(i\bmod n\) 个点,所以如果每 \(n\) 个分一组,每个时刻修改的就是包含根的一个连通块。

对于没有修改的问题,容易进行 DP 线性计算答案。

对于带修问题,考虑从后往前倒着修改,任意时刻未修改的点是一个包含根的连通块。此时考虑将点 \(x\) 权值从 \(a_x\) 修改为 \(y\) 对答案产生的贡献。即计算有多少路径经过 \(x\) 且符合条件,也就是从根开始需要 \(1,2,3,\cdots,a_x-1\),子树需要 \(a_x,a_x+1,\cdots,l\)。由于根肯定还没修改,预处理的时候计算即可。子树则全部都修改完了,也容易 DP 求出。复杂度线性或者 \(1\)\(\log\)

151 NFLS 模拟赛 T3

考虑进行一些观察。进位的结构显然形如,只有后面 \(5\) 位会变化多次,前面的位最多进位一次。

如果前面没有进位,则只需要考虑后面的位。注意到一个有值的位置告诉了我们 \(a_1+i \bmod 10^k \in [l,r]\),所以立即得知 \(a_1 \bmod 10^k \in [l',r']\),差分一下即可得到哪些 \(a_1\) 符合条件。

对于有进位,考虑某个位置形如 \(x999\cdots9\),然后下一步变为了 \((x+1)000\cdots 0\),你应该是可以直接枚举这个位置在哪里以及枚举后面的 \(9\) 数量。这个枚举量是 \(O(nm)\) 的,然后你可以确定 \(a_1\) 的值是多少,然后就做完了。

152 NFLS 模拟赛 T4

对于确定的 \(k\),依次删去图中度数小于 \(k\) 的点直至不存在为止,显然选的子图 \(G\) 是新图上的一个连通块。

倒着做这个过程,并查集维护即可。

153 P11987

显然当序列确定时,能得到的最大数量为 \(n^2-c\)\(c\) 为有多少 \(x,y\) 使得 \(lst_x<fir_y\)\(lst,fir\) 分别表示第二次与第一次出现位置。

不难看出每次交换相邻的最多使最大数量加 \(1\),不难猜测存在策略使得每次都能取到 \(+1\)。证明应该不太难。

然后就直接有一个多项式复杂度的算法了,瓶颈在于对每个位置求从这个点开始断开后对应的这个答案。这很容易树状数组维护的。复杂度 \(O(n \log n)\)

154 P11993

两个思考方向,第一个显然是尝试通过均摊的方式模拟向上的过程,遗憾的是并不很有前途。

另一个思考方式是常见技巧,尝试换维,也就是说将往上跳的过程改为在子树维度的查询,也就是 DFN 区间查询,而对于每一层维护这一层内的权值对应的 DFN 位置。然后这个就可以轻松使用线段树合并了,复杂度 \(O(n \log n)\)

155 P11348

如果现在考虑全局询问,对于每个 \(i\) 找到最优的 \(j\) 使得题目所求值最大时,令 \(op_i\) 表示最优的 \(j\),不难发现 \(op_i\) 单调不升。这个问题本质上类似于决策单调性,可以分治优化转移。

对于原问题。考虑分块。令块长为 \(B\),对于两个序列都进行分块,对最优点对分类讨论。大概有两种,分别是整块对一个区间与散块对散块。对于前者,初始化时枚举每个块,对另一个序列分治后,询问本质上就是区间 RMQ。散块对散块,只需要把散块都拉出来做分治即可。复杂度 \(O(n\sqrt n\log n)\)。区间 RMQ 不能用 ST 表,否则空间会爆。写个 zkw 线段树即可在 \(6\) 秒时限下通过。

156 P11342

没有奇环等价于是二分图,尝试对黑白染色进行 DP。

然后就直接做完了。\(f_{i,0/1,0/1,0/1}\) 记录了根,左侧与右侧叶子的颜色,直接转移即可。复杂度线性。

157 NFLS 模拟赛 T1

大概是你按照某个东西排序后,为每个连通块钦定代表元为最靠前的点进行计数即可。

158 NFLS 模拟赛 T2

对子树结构做一下,维护子树内的点构成连续段数就可以 DP 了。

159 NFLS 模拟赛 T3

做过,不讲。

160 NFLS 模拟赛 T4

好题。

考虑为什么递归进去能减少次数,这是因为递归到 \(l=r\) 时不需要进行操作。

所以答案应该为冒泡排序中每个点最后一次复位之前执行的操作次数。

也就是,对于 \(i\),将小于 \(i\) 看作 \(0\),等于 \(i\) 看作 \(1\),大于 \(i\) 看作 \(2\),则其对答案的贡献是最后一个 \(0\)\(1\) 前面,\(1\)\(2\) 的个数。即最后一个 \(\leq i\) 的数前 \(\geq i\) 的数的个数。

把式子弄出来很容易优化的。

161 P11295

如果能求出每个点第一次爆了的时间,那么之后时光倒流,对每种颜色建 set 维护所有 DFN 位置容易做到 \(O(n \log n)\)

第一次爆的位置可以树剖做到 \(O(n \log^2 n)\),太烂了。注意到每个点第一次爆的时间就是子树内 \(k\) 小时间,线段树合并即可。

162 P11302

【模板】动态 dp。

大概就是单组询问你从前往后做每个点有 \(2^k\) 个状态的 DP。所以 DDP 复杂度就是 \(O(8^kn \log n)\)

163 P11318

显然是基于均摊的东西。每次操作只要最大值比次大值还大就继续操作,直到最大值和次大值合并。对最大值进行操作容易使用吉司机线段树。

164 P11336

【模板】最短路树。

建出树后只需要做 \(1\)\(n\) 链的区间 chkmin,用你喜欢的方式维护就好。

posted @ 2025-08-31 21:29  HappyBobb  阅读(163)  评论(2)    收藏  举报