10 月做题记录

1 NFLS 模拟赛 T1

每个点处理一些信息,选好枚举哪个点就行。

2 NFLS 模拟赛 T2

首先,所有 \(x_i+y_i\) 奇偶性相同是必要条件。其次,其也是充分条件。

观察大样例可以看出其给的是 \(1,2,4,8,\cdots\),对这个东西构造即可。大概是你尝试归纳证明用 \(2^0,2^1,\cdots,2^k\) 能表示出所有 \((a,b)\),其中 \(0 \leq a, b \leq 2^{k-1}\),题目的 \(40\) 限制是不紧的。

3 NFLS 模拟赛 T3

点分治单侧递归,查询时用长剖,这样就是 \(O(n\log^2 n)\) 的。

我写了,过不去。

注意到找到全局最长 LIS 链后,删的点肯定在链上,从两个端点出发做一次就是 \(O(n\log n)\) 的了。

4 QOJ8729

注意到问题等价于一个异或方程组,答案是 \(2^{m - \mathrm{rank}}\)。我们的目标是尽量减少异或方程数量。如果有 \(c\) 个这样的限制,我们可以在 \(O(\dfrac{cm^2}{w})\) 的复杂度内求出答案,一个个插入线性基,bitset 维护即可。

考虑对于每个 \(u\),求出以 \(u\) 为根的叶向生成树。我们声称只需要考虑经过一条非树边的路径的限制即可。所以总共有 \(O(nm)\) 个限制,复杂度 \(O(\dfrac{nm^3}{w})\),足以通过。

这么做的正确性在于每条路径都能被若干经过一条非树边路径做对称差得到,这是一个经典技巧。

5 P11986

这题很厉害。

四个角落不是很容易刻画。观察一些性质。一个点 \((x,y)\) 距离左上角为 \(x+y-2\),距离右下角为 \(2L-(x+y)\)。所以不可能存在两个点 \((x_1,y_1)\)\((x_2,y_2)\),使得 \(x_1+y_1 < x_2+y_2\),而前者选的是右下,后者选的是左上。

假设左上为 \(1\),右下为 \(4\),右上为 \(2\),左下为 \(3\)。也就是说,将所有点按照 \(x+y\) 排序,存在一个最优解存在一条分界线使得前缀都选的是 \(1,2,3\) 中的一个,后缀都是 \(2,3,4\) 中的一个。

左上右下并不特殊,左上右下也有这样的限制。故如果我们按照 \(x-y\) 排序,有分界线使得前面选的是 \(1,2,4\) 中的一个,后缀选的是 \(1,3,4\) 中的一个。

枚举这两条分界线,所有点被划分成了 \((1,2),(1,3),(2,4),(3,4)\) 四种,分别表示其可能处于的两个角落。

对每个集合做一个 DP,求出第一种所选的总距离为 \(x\) 的情况下第二种的最小总距离 \(f_x\)。枚举 \((1,2)\)\(1\) 的总距离 \(x\),得到 \((1,3)\)\(1\) 的距离最大值 \(T-x\),从而确定 \(2,3\) 在前两组的距离最大值,然后就可以判定 \(4\) 是否符合条件。

直接这么做是 \(O(n^3T)\) 的,枚举分界线是 \(O(n^2)\) 的,DP 是 \(O(nT)\) 的,但不难注意到枚举第一条后只需要预处理前后缀的 DP 值就是 \(O(n^2T)\) 的,可以通过。

6 P10202

问题等价于,每次选一个连续同色区间删去,问方案数。

考虑区间 DP。对于每个区间,转移 \([l,r]\) 时我们希望考虑最后一次删掉了一个同色段对应原序列的某个区间 \([l',r']\),然后 \([l,l'),[l',r'],(r',r]\) 三部分独立。为了计算方案数,显然要计算这些操作序列拼在一起的方案数,故要记一个 \(k\) 表示操作序列长度。对于 \([l',r']\),我们要求最后一次恰好删去一个包含 \(l',r'\) 的子序列,所以考虑状态 \(f_{l,r,k}\)\(g_{l,r,k}\),分别表示没有要求与要求最后一次删去了 \(l\)\(r\) 的方案数。转移是不难的,考虑最后一次删了什么就行。复杂度 \(O(n^5)\)

7 P10200

有经典结论:对于任意正整数 \(a<b<c\)\(\min(a\oplus b, b\oplus c) \leq a \oplus c\)

故任选两个 \(\oplus\) 的最小值只需考虑排序后相邻两项。

据此设计 DP。将序列排序后记 \(f_{i,j}\) 表示 \([1,i]\)\(a_i \in S_1\),上一个 \(\in S_2\) 的数为 \(j\) 的方案数。转移容易通过 01-Trie 进行优化,复杂度 \(O(n(\log n+\log V))\)

8 P10203

圆方树上做换根 DP 就行。不用带什么脑子不过可能要想清楚细节。

9 P10284

平衡树有交合并模板,过程等价于维护一个变量 \(s\) 初始为 \(0\),每次若 \(s \leq 0\)\(s \gets s + a_i\) 否则 \(s \gets s - a_i\),离线下来做插入标记回收就行。\(a\) 单调不增好像不是很有用。

10 炼石 NOIP R11T1

不讲。

11 炼石 NOIP R11T2

倒着从 \(n\)\(1\) 做,简单 DP,转移注意前缀和优化一下。

12 炼石 NOIP R11T3

不难看出求的是一个树的拓扑序计数状物。

如果直接维护对偶图其实有点难,但是考虑到若询问点为 \(x\),一条对角线 \((l,r)\) 对应的一侧子树大小只和 \(x\)\((l,r)\) 哪一侧有关。所以这个过程是容易线段树维护区间乘单点查即可解决的。

13 炼石 NOIP R11T4

also known as JOI 2024 Final Road Service 2

问题显然等价于有若干区间,每次询问选定其中若干个。在每个位置选择花费 \(1\)\(2\),用尽量先少的花费使得选定的连通。

首先选定的可以视作两两没有包含关系。按照 \(l\) 排序后 \(r\) 也递增。

考虑 \(c=1\)。这个过程看起来只能贪心。大概就是第一个打通的肯定是第一个区间右端点,然后从前往后考虑每个区间,如果现在连通块右端点还没有下一个右端点大,那就只能选目前连通块右端点。否则应该选下一个不属于连通块的询问区间的右端点。这个过程可以倍增优化。

\(c=2\) 时,注意到如果我们考虑答案为 \(ans\),显然我们只关心 \(ans-1\)\(ans\) 的状态,因为更小的显然不会更优。维护这两种花费对应的目前连通块最靠右的位置,倍增时处理一下,做法应该是类似的。

14 P14134

我有一个很神奇的做法。

具体来说,直接分治时,我们不方便判定 \(0\) 到底在哪一侧,原因显然是分出来的两部分的返回值可能相同。

考虑维护两个候选集合,满足这两个候选集合的第一类询问结果相同,均为 \(s\)。记这两个集合分别为 \(S_1\)\(S_2\)。则我们知道这两个集合有一个 \(\mathrm{MEX}\)\(s\),另一个 \(\min\)\(s\)

每次分治出 \(S_{1,0},S_{1,1},S_{2,0},S_{2,1}\),并分别询问 \(S_{1,0}\)\(S_{2,0}\)。注意到若有其中一个结果小于 \(x\) 则意味着那一侧应该是符合要求的。否则新的 \(S_1\)\(S_2\) 分别为两侧中询问值为 \(x\) 对应的那部分,即如果 \(S_{1,0}\) 询问结果是 \(x\) 则新的 \(S_1\)\(S_{1,0}\),否则是 \(S_{1,1}\)

这个次数大概是 \(2\) 次询问可以除以 \(2\),总次数 \(2\lceil \log_2 n\rceil\) 附近,测试出来只有 \(33\) 次。

15 P14135

先做一个子树的情况。

注意到如果只有操作 \(1\),显然要求每个点有 \(a_u \geq a_{fa_u}\),答案是 \(\sum a_u - a_{fa_u}\)

对于 \(2\) 操作,我们先从下往上调整使得 \(a_u \geq a_{fa_u}\) 成立,然后考虑什么样的操作能获得正收益。

不难看出,令 \(d_i\) 为深度为 \(i\) 的点数,对深度为 \(i\) 进行操作的收益为 \(d_i-d_{i+1}-1\)。那么对这个从深到浅贪心即可。

对于原问题,每个子树答案和深度有关。长链剖分优化即可。我没写。

16 P12448

由于增量是 \(1\) 所以你找到左右第一个比这个位置大的,然后就是做 \(O(1)\) 次区间加等差数列,单点查询,直接做就行。

17 P12587

一个点的权值是前后缀 \(\max\) 的较小值减去其自身对 \(0\)\(\max\)

注意到前后缀 \(\max\) 中有一个是全局 \(\max\),所以找到全局 \(\max\) 后就是前后缀问题。

这很容易用单侧递归线段树做,复杂度 \(O(n \log^2 n)\)

18 P12619

这都是啥。

总而言之就是你要做 \(n=200\) 的一般图最大权匹配。我也不会做,找个板子拉下来就行了。

19 CF2128E2

注意到一个区间 \([l,r]\) 向左或右加入或删除一个数,中位数覆盖到的集合是连续的。

找到最小和最大中位数对应区间,类似莫队扩展就行了。

找最小和最大容易二分。复杂度 \(O(n\log n)\)

20 NFLS 模拟赛 T1

不讲。

21 NFLS 模拟赛 T2

不讲。

22 NFLS 模拟赛 T3

这个问题不难转化成形如最大权 \(k\) 重区间覆盖问题,跑费用流就行。写 SPFA 是 \(O(mn^2)\) 的,能过。更有道理的就写个原始对偶。

23 NFLS 模拟赛 T4

做过一万遍了,不写了。

24 P11712

问题为,给你一个连通图,问是否有方法删掉不多于两条边使其变为一个二分图,并输出达到最小的方案数。

DFS 树是解决无向图问题的有力工具。

先考虑判定是否存在方案删去一条边使其变为二分图。

众所周知一个图是二分图等价于任意一个回路长度为偶数。另一方面,一个图的所有回路是 DFS 生成树的非树边直接形成的简单环进行对称差所生成的。考虑删掉一条边,若其为非树边,要求其是唯一一条形成奇环的非树边。若其为树边,要求经过其的非树边构成的环都是奇环且所有非树边构成的奇环均经过这条边。后者显然必要,前者的必要性在于,若同时存在一个奇环和偶环经过这条边,对称差后得到了一个不经过这条边的长度为奇数的回路。不难证明这同样是充分条件。

若必须至少删去两条边 \(e_1,e_2\),考虑若分别存在两个非树边构成的奇环和偶环同时经过 \(e_1\)\(e_2\),则对称差后得到了一个不经过 \(e_1,e_2\) 的奇环。另一方面,若存在两个非树边构成的奇环和偶环只经过 \(e_1\) 不经过 \(e_2\),则也得到了一个不经过 \(e_1,e_2\) 的奇环。

基于上述事实,进行一些分类讨论,不难得到,删去两条边 \(e_1\)\(e_2\) 合法当且仅当在只考虑偶环时这两条边切边等价,且包含他们的非树边奇环集合构成了所有非树边奇环集合的无交划分。

上述过程容易用异或哈希解决。

25 P11391

一个长度至少为 \(3\) 的回路双射成对偶图的一个连通块。问题等价于树的连通块计数。

26 P11432

注意到若区间 \([l,r]\) 中第一次激活的是某个位置 \(x \in (l,r)\),则不如之前在 \(l\)\(r\) 时停在那里等待,直到时间到了再走。

所以问题等价于 \(O(n)\) 个限制 \(x_i,t_i\),表示 \(x_i\) 激活时间大于等于 \(t_i\)

此外,考虑类似时间轴扫描线,坐标维上用一个 \(01\) 字符串表示每个位置是否已经被激活。则任意时刻,\(1\) 的位置一定是一段前缀与后缀的并。因为若中间某个位置激活了而两边没有激活,可以改为等到最后一次经过这个点时再激活。

综上,容易区间 DP 计算答案。复杂度 \(O(n^2)\)

27 炼石 NOIP R12T1

不讲。

28 炼石 NOIP R12T2

一看就是根号分治状物。

\(k \geq \sqrt{n}\) 时直接做就行。

\(k<\sqrt n\) 时,我们希望对于每个 \(r,x\) 都计算出 \(\sum \limits_{i\equiv r \pmod k} \dbinom{i}{x}\),记答案为 \(s_{r,x}\),注意到组合恒等式 \(\dbinom{n}{m}=\dbinom{n-1}{m}+\dbinom{n-1}{m-1}\),且有 \(k\mid n\),所以 \(s_{r,x} = s_{r-1,x-1}+s_{r-1,x}\)\(r=1\) 时需要特判一下,因为最后的第 \(n\)\(n-1\) 项应该是不存在的。

现在只需要能求出 \(s_{0,x}\) 就行,即对于所有 \(x\) 求出 \(\sum \limits_{i} \dbinom{ik}{x}\),记为 \(f_x\)

考虑到 \(\dbinom{n+k}{x} = \sum \limits_{i=1}^k \dbinom{k}{i}f_{x-i}\)。这个是容易通过两边做差归纳证明的。所以可以在 \(O(nk)\) 的复杂度内递推出 \(f_x\)。总复杂度 \(O(n \sqrt n)\)

29 炼石 NOIP R12T3

缺一分治模板,注意到可以在 \(O(n^2)\) 的复杂度内激活一个点,所以缺一分治复杂度就是 \(O(n^3\log n+q)\)。空间是 \(O(n^2\log n)\) 的。

30 炼石 NOIP R12T4

BST 等价于 \((p_i,i)\) 的小根笛卡尔树。

你把每个点 \((p_i,i)\) 画在平面直角坐标系中,问题就转化为了 \(n=5000\) 量级的最优二叉搜索树问题。这个问题是有四边形不等式的,复杂度 \(O(n^2)\)

31 P11593

很诡异的一个题。

二分答案 \(k\),把过程反过来,问的就是是否存在一条边界开始的路径,第 \(i\) 个点权值 \(\geq k - i+1\)

注意到如果在相邻两个点之间连一条边权为点权较小值的边,则我们只需要在 Kruskal 重构树上走来走去。对这个东西 DP 就行了。复杂度 \(O(nm \log nm)\)

32 P11197

经典的 \(O(n \log n)\) 三维偏序模板。

具体来说,我们对于 \(i,j\),考虑 \(S_{i,j} \subseteq \{0,1\}^3\),表示每一维是否有 \(i\) 小于 \(j\)。即求 \(\sum \limits_{i \neq j} [S_{i,j}=\{1,1,1\}]\)

注意到 \(S_{i,j} = \{1,1,1\}\)\(S_{i,j} = \{0,0,0\}\) 数量相同。做一个容斥就会发现你只需要做 \(3\) 次二维偏序了。

33 P11241

点分树优化建图模板。

34 ARC151E

如果 \(X,Y\) 最长公共子串长度为 \(l>0\),答案即为 \(|X|+|Y|-2l\)。用你喜欢的方式求最长公共子串即可。

考虑 \(X,Y\) 最长公共子串为 \(0\),这个题的限制非常的不自然,要求 \(X\) 在操作时非空。所以先考虑 \(|X|=1\) 的情况。不难发现目标就是尽量快地令 \(X\) 成为 \(Y\) 的某一个字符。这个东西建图跑最短路就行。

\(|X|>1\) 是一样的,操作肯定是找到某个字符然后删 \(X\) 变为那一个字符。直接做就行。

注意到最短路本质上是边权相同的,所以瓶颈是最长公共子串,所以显然可以做到严格线性,不过不重要。

35 ARC207C

就是说分成尽量多区间使得每个区间的或非严格递增。

这个是经典套路。显然只有 \(O(n \log V)\) 个状态,编一个小于 \(O(n\log^3 V)\) 的就可以通过。我的是 \(O(n\log^2 V\log \log V)\) 的。

36 ARC207A

注意到 \(\sum \limits_{i=1}^n \min(i-1,a_{p_i}) = \sum \limits_{i=1}^n \sum \limits_{j=i+1}^n [a_{p_j} \geq i]\),从后往前 DP 就行。复杂度 \(O(n^4)\)

37 ARC156D

根据 Lucas 定理,每个 \(a_i\) 的出现次数 \(c_i\) 构成 \(k\) 的一个二进制划分。

问题变为对 \(k\) 二进制下的每个 \(1\) 分配一个 \(a_j\),贡献是 \(a_j \times 2^i\),求贡献和的异或和。

从后往前 DP,注意到 \(a \leq 1000\),所以往前贡献不超过 \(10\) 位,把往前贡献的值记录到 DP 状态中即可。复杂度 \(O(na \log k)\)

38 ARC165E

这个题很有趣。

整个问题是动态的,很难刻画,任意时刻你甚至都不知道有多少个点满足其连通块内点数 \(>k\),所以不好做。

对于这种选点要符合限制,且限制和之前决策有关的问题,尝试把限制去掉。具体来说,我们将操作改成每次任意选一个点,如果其所属连通块大小大于 \(k\),将其删去并对次数贡献 \(1\),否则跳过。显然一个点被选多次没有意义,所以问题可以转化为求所有 \(1\)\(n\) 的排列的贡献次数和。

到这一步还是不好做。此时考虑为每次有效操作钦定代表元进行计数,具体来说我们将每次有效操作的贡献记录在其所选点的那个连通块上。那么我们要计算原树上每个连通块在某次操作中被选的概率和,即为答案。

对于一个大小为 \(x\) 的连通块,若其被贡献要求 \(x>k\),令连通块外面挂着 \(y\) 个点,则相当于排列 \(p_1,\cdots,p_n\) 中这 \(y\) 个数中任意一个数都出现在 \(x\) 个数之前。概率为 \(\dfrac{x!y!}{(x+y)!}\)

对原树任意选根,每个连通块在其顶端进行贡献。这样就可以直接做子树 DP 了。\(f_{i,j,k}\) 表示 \(i\) 为根的连通块,大小为 \(j\),外面挂了 \(k\) 个点的连通块数量。这样复杂度就是 \(O(n^4)\) 的了。

39 P14176

这种题都不会做,没救了。

令每一行或列的状态为其最后一次操作所覆盖的颜色。

一个 \(k\times k\) 子矩形合法,当且仅当其对应的行的状态都是 \(1\),且列被染 \(0\) 的最晚时间小于行染 \(1\) 的最早时间,或者把行列反过来。

这个直接树状数组维护就好了。

40 P14177

先做 min-max 容斥,变为求所有 \(S\)\((-1)^{|S|-1}E(\min \limits_{i\in S} T_i)\) 的和。

对于 \(S\),假设有 \(x\) 个 chkmax 操作会使得 \(S\) 内某个 \(i\) 变为合法,则其成功率为 \(\dfrac{x}{m}\),期望次数即为 \(\dfrac{m}{x}\)。令 \(g_S = x\)

我们只需要对每个 \(x\),求所有满足 \(g_S=x\)\(S\)\((-1)^{|S|-1}\) 和即可。

考虑区间 DP。\(f_{l,r,x}\) 表示只考虑区间 \([l,r]\) 内所有满足 \(a_i \geq a_{l-1}\)\(a_i > a_{r+1}\) 的点与包含于这个区间内的 chkmax 操作时的答案。转移枚举区间中被选入 \(S\)\(a\) 的最小值,则左侧都大于他,右侧都大于等于他,跨过这个点的区间数量容易算出,复杂度 \(O(n^3m^2)\)

可以拉插优化,把 \(f_{l,r}\) 看作多项式带点值进去算即可。

42 NFLS 模拟赛 T2

分块并查集即可通过,跑得飞快。离线下来每个块单独做即可做到线性空间。

但这个题其实可以 polylog,非常厉害。

考虑对于每个数 \(x\),维护 \(01\) 序列,每个位置 \(i\) 表示 \(a_i \geq x\) 是否成立。

修改只需要做可持久化线段树分裂合并,查询做线段树二分即可。

43 NFLS 模拟赛 T3

你觉得这是题吗。

没有 \(01\) 个数限制那么令 \(s_i = \mathrm{popcount}(i)\) 即可,满足相邻两个数权值不同。

对于原问题。考虑若存在映射 \(f_i\),满足相邻两个基本不变。那么令 \(s_i = f_i \oplus \mathrm{popcount}(i)\) 即可。

注意到限制为 \(\lceil \sqrt n \rceil\),考虑分块。令 \(f_i=1\) 当且仅当 \(i\) 存在某一块全 \(1\),不难说明确实符合条件。

44 NFLS 模拟赛 T1

考虑 DP,直接转移是 \(O(nm^2)\) 的,但是不难看出可以用个单调队列就可以做到 \(O(nm)\)

45 NFLS 模拟赛 T2

这个题很简单的,你只需要对于每个树上的点记录其对应第二棵树上的哪个连通块,以及对应的连通块中的点是哪个。虽然看起来有 \(O(n2^m)\) 个状态转移还得做无交并卷积,但是注意到每个点上保留的状态必然是一个向外至多一条出边的连通块,所以根本跑不满。

46 NFLS 模拟赛 T3

相信大家都做过排列值域连续子段计数,做法是注意到区间 \(\max - \min \geq r-l\),且当且仅当值域连续时取等。

对于这个题,你对交的部分扫描线就行。看起来就是可做的,分析一下也是可做的,带着单调栈做扫描线线段树上维护一些信息就行。

47 ARC148E

牛完了。

对于排列计数,常见考虑方式有连续段 DP,或者按照某个顺序插入能做到没有后效性地确定每次插入的方案数。当然也可以考虑按照序列维依次加入并插入到之前的位置,或者考虑双射等一般计数手法。

但这个题好像每个都不太容易做。这就不得不提起相邻两个数和大于等于 \(k\) 的经典处理技巧了。我们将小于 \(\lceil \dfrac{k}{2} \rceil\) 的数记为 \(0\),将大于等于的记为 \(1\)\(1,1\) 相邻肯定符合条件,\(0,0\) 相邻必定不符合,而 \(0,1\) 相邻则取决于具体值是什么。

现在考虑按照某个顺序插入所有数使得插入没有后效性,并且一个排列合法当且仅当其按照插入顺序依次插入满足任意一个前缀时间合法。注意到如果我们按照 \(k,0,k-1,1,k-2,2,\cdots\) 的顺序依次插入所有数,则插入一个 \(1\) 时,要求是不能和之前的 \(0\) 的相邻。而插入一个 \(0\) 时,限制竟然也是不能和 \(0\) 相邻。而 \(0\) 本来就两两不相邻,所以空位数就是 \(l+1-2c\),和之前的插入方式完全无关。并且不难验证这个插入顺序每个前缀都合法等价于排列合法。

复杂度 \(O(n \log n)\),瓶颈在于排序。

这个题的精妙之处在于,想到按照这个顺序插入不依赖之前的决策,这个确实很厉害。

48 ARC136E

先刻画 \(i<j\) 满足 \(i\) 能走到 \(j\) 的条件。令 \(p_x\)\(x\) 最小质因数。

首先 \(i,j\) 同为偶数必然可行。

否则,若 \(i\) 为奇数,\(j\) 为偶数,则 \(i\) 能到 \(j\) 当且仅当 \(i+p_i \leq j\)\(i,j\) 同为奇数,当且仅当 \(i+p_i \leq j-p_j\)

首先我们可以发现,最小的 \(y\) 使得 \(y>x\)\(\gcd(x,y)>1\)\(y=x+p_x\),证明显然。且 \(x\) 是奇数则 \(p_x\) 一定也是奇数,故 \(x+p_x\) 为偶数,所以上述条件的充要性不难推出。

考虑若反链存在偶数,枚举其为 \(2 \mid x\)。此时选的其余奇数若有 \(y<x\),则 \(y+p_y > x\),若 \(y>x\)\(y-p_y < x\)。事实上发现这个东西不仅能保证其他数与 \(y\) 互相不能到达,也能保证其余奇数内部互相不能到达,分类讨论这些奇数与 \(y\) 的大小关系即可。所以枚举 \(x\) 后能取得的最大权值容易计算。

所有数都是奇数时,不难发现类似地存在一个 \(x\) 使得小于等于其的和大于其的在这个点分开,所以也是直接计算即可。

49 ARC127D

这个题相对简单。

枚举一个位 \(x\),计算 \(a_i \oplus a_j\)\(b_i \oplus b_j\)\(x\) 之前的位相同,但这一位不同时的答案。令 \(a'_i,b'_i\)\(a_i,b_i\)\(x\) 之前的位的答案,则要求 \(a'_i\oplus b'_i = a'_j \oplus b'_j\),且 \(a_i,a_j\) 在这一位下的相等情况与 \(b_i,b_j\) 不同。将 \(a'_i\oplus b'_i\) 划分为等价类后不难计算答案。复杂度 \(O(n\log^2 V)\)

50 ARC124E

我们非常希望能对于所有 \(b_i \in [0,a_i]\) 计算 \(\prod (a_i-b_i+b_{i-1})\),但是这个答案显然会算重。

不过注意到任意一个合法的最终序列 \(x\) 都对应到一个存在某个 \(b_i=a_i\)\(b\) 序列,证明显然。

对这个东西计算就不难了。用 \(b_i \leq a_i\) 减去 \(b_i < a_i\) 的答案即可。

\(b_i \leq a_i\) 怎么做呢。即求 \(b_i \in [0,a_i]\)\(\prod (a_i-b_i+b_{i-1})\) 的和。每个 \(i\) 可以取 \(a_i,-b_i,b_{i-1}\),先忽略环的问题,从前往后 DP 即可。对于环,枚举 \(1,n\) 的情况从 \(1,n\) 处断环为链即可。

51 P12729

枚举 \(a\) 中的子串开头位置 \(i\),不难求出最大的 \(j\) 满足 \(a[i\cdots j]\)\(b\) 中出现过。这个容易通过后缀数组算出。

然后在 \([i, j]\) 中找到最靠后的 \(x\) 使得 \([i,x]\) 括号匹配也是不难的,这个预处理前缀和与单调栈就能算。

写个线性后缀数组就可以做到严格线性。

52 P12653

好像是个点分治模板,不用带脑子。

53 P11127

这个题比较简单。

显然就是说你要计算到根路径上是左儿子的 \(-1\) 与是右儿子的 \(0\)\(-1\)

而修改是编号的连续段,查询是到根路径,经典是不能 polylog 的。对序列分块,然后直接就做完了,可能需要平衡一个分块做区间加什么的,但都是简单的。

54 P12969

一个序列合法当且仅当总和为 \(n-1\),且将每个数减 \(1\) 后除了全局外每个前缀和都非负。

找到全局最靠左的前缀和最小值点,不难注意到如果循环位移开头在其左侧,则必然不可行,因为这意味着中间这一段的和为负数。若在后面,则后缀和大于等于 \(-x\)\(x\) 为最小前缀和。若是这样,则 \(x\) 开始存在一段后缀的前缀满足和是负数,与 \(x\) 为最小前缀和矛盾。故最多只有一个这样的点,位置就在 \(x\)。然后都是容易维护的。

55 P11704

肯定有一条路径经过 \((1,2)\)\((n-1,m)\),另一条经过 \((2,1)\)\((n,m-1)\)

路径不交限制太难受了,LGV 引理转化为没有限制。

然后相当于计算有多少两条路径,满足第一条从 \((1,2)\)\((n-1,m)\),第二条从 \((2,1)\)\((n,m-1)\),且经过所有关键点。

将关键点按 \((x,y)\) 二元组排序,可以把路径的过程按照时间写成若干个 \((i,j,0/1)\),表示已经走完了 \([1,i]\) 之间的所有点,一个结束在 \(i\),另一个结束在 \(j\),且 \(i,j\) 对应的是 \((1,2),(2,1)\) 开始的还是相反的。DP 容易转移,复杂度 \(O(k^2)\)

56 P10052

有一个基于值域的 DP。\(f_{i,0/1,0/1}\) 表示目前在时刻 \(i\),所处第一个还是第二个教室,另一侧的教室这个时刻所放的之前有没有看过。转移是容易的。

使用经典技巧值域定义域转换就做完了。

口胡的,假了踢我。

57 P7828

首先答案是逆序对数。

注意到交换操作是交换相邻两个,所以对逆序对的贡献只有这两种数对应的逆序对。

考虑根号分治。设阈值 \(B\)。将所有数称为小数或大数,分别表示其出现次数小于等于或大于 \(B\)

考虑所有逆序对,分别是小数对小数,小数对大数,与大数对大数。

小数对小数与小数对大数都可以在修改的时候直接做。而我们可以预处理任意两个大数之间的贡献。复杂度看起来是 \(O(n\sqrt n)\) 的。

58 P12923

首先暴力扩展就是调和级数的,具体来说维护目前极长前缀,每次选起点小于等于前缀 \(+1\) 位置的一个子串向后。每个点只会被至多两个子串包含,复杂度是调和级数的。

然后问题在于求那个小于等于某个位置开头的子串。上一些后缀结构或者在失配树上做就是 \(O(n\log^2 n)\) 的,不够优秀。

注意到如果我们能正着和反着处理 Z 函数,按照前缀长度扫描线就能直接做序列并查集了。复杂度 \(O(n \log n \alpha(n))\)

59 P12768

竞赛图缩点是链,只要能缩点就好了。

有一个直接数据结构优化建图的做法,但是空间限制太低了肯定过不去。

考虑将所有数按照其之间直接的边的顺序排序。这不是一个偏序关系所以你可能要手写一个排序。得到这个排列后必定满足每个 SCC 是一个区间,这是显然的。

问题变为划分出所有 SCC。从前往后尝试依次求出每个 SCC,即目前已经求出了 \([1,i]\),找到最小的 \(j\) 满足 \((i,j]\)\([j+1,n]\) 的边都是后面指向前面的。这个问题只需依次枚举 \(j\),要求的是所有比 \(j\) 更劣的点都在后面,也就是求两个序列前缀交的最大值,这个东西可以线段树做,而过程是可以离线的所以空间是线性的。大概应该是这么做的。

60 CF1866E

没看懂这个题在考察什么。

显然只有 \(O(q^3)\) 个状态,每个前缀只有 \(O(q^2)\) 个状态。然后转移直接枚举之前的状态就做完了啊。

61 NFLS 模拟赛 T1

倒着做就是经典的直径合并问题。并查集维护每个连通块的直径端点即可。

62 NFLS 模拟赛 T2

枚举每种颜色,计算以其为严格众数的区间个数。将等于这个数的位置设为 \(1\),不等于的设为 \(-1\),即求有多少区间和严格大于 \(0\),带 \(\log\) 做法是很容易的,过不去。

正解应该是说注意到前缀和数组是形如若干斜率为 \(-1\) 的线段拼在一起,所以有意义的位置只有线性个,可以线性维护的。

63 NFLS 模拟赛 T3

单调队列优化 DP。

64 ARC140D

最终图的形态是基环树森林。所以连通块个数等于环的个数。

先把给的边连了,那么每个连通块是基环树或树。基环树一定会产生恰好 \(1\) 的贡献,而每棵树有一个点可以向任意点连边。钦定 \(k\) 个位置成环,贡献就是 \((k-1)!\prod s_i\),直接 DP 就行。

65 ARC138D

首先一个排列合法,将所有数异或上任意数 \(x\) 后均合法。

\(2\mid k\) 显然无解,\(k=1\) 显然有解。

如果 \(k=n-1\) 有解,我们不难通过截取后 \(k+1\) 位和前面分开,前面做 \(k=1\),后面做 \(k=n-1\) 即可。

\(k=n-1\) 怎么做呢。注意到每次枚举一个 \(\mathrm{popcount}=n-1\) 将目前的值异或上他,若不在集合内则加入,可以构造出所有 \(k=n-1\) 的答案。然后就做完了。

66 ARC158E

分治就做完了。复杂度 \(2\)\(\log\)

67 ARC127E

先考虑怎么判定一个集合 \(S\) 是否可能成为最终集合。

考虑倒着处理每个操作。遇到 \(1\) 时,删去集合中任意一个数。遇到 \(2\) 时,向集合中加入一个比目前最大值大且没出现过的数。

贪心的,遇到 \(1\) 肯定移除集合中最大值。\(S\) 合法当且仅当每一次操作 \(2\) 都能成功删去一个数。

考虑将整个操作过程分段,每一段是一个极小区间使得区间中 \(1\)\(2\) 多一个。每个区间恰好依次删去了 \(S\) 中从大到小的所有数。对这个过程进行 DP,每次往下一个区间时钦定新的被删去的最大值即可。复杂度 \(O(n^2)\)

68 炼石 NOIP R14T1

每位单独算就可以换根 DP 了。

69 炼石 NOIP R14T2

唐氏症题。

注意到对于一个长度大于等于 \(5\) 的序列来说,令所有数的最高位为 \(2^k\),有 \(c\) 个数包含这一位。则若 \(2 \mid c\),答案为 \(0\),否则答案为 \(2^k\)。枚举最高位将所有数看作 \(0,1,-1\) 即可。

对于长度小于 \(5\) 的区间,暴力。

70 炼石 NOIP R14T3

显然二进制数可以用线段树模拟。为了比较大小维护一下哈希即可。

当然你也可以用 set 做颜色段均摊,都能做的。

71 炼石 NOIP R14T4

直接 DP 需要记录树高,点数等一堆信息,状态数很大。考虑一步步分析性质。

我们尝试按照子树深度大到小依次确定树的形态。初始时,有一个点为根,子树深度未知,不妨记为 \(h\)。第二步,其会产生两个儿子,深度同时是 \(h-1\) 或一个为 \(h-1\) 另一个为 \(h-2\)。可以发现任意时刻我们只关心两种子树深度的点。假设现在深度为 \(h\),我们关心有多少个点深度为 \(h-1\),有多少个点深度为 \(h-2\),分别记为 \(x,y\),则之后枚举 \(x\) 个点有多少产生了不同深度的儿子就能转移到下一步状态。具体来说,如果现在状态是 \((h,x,y,k)\),枚举 \(c\)\(x\) 转移成了 \((h-1,h-1)\)\(x-c\)\(x\) 转移成了 \((h-1,h-2)\),则新的状态变为 \((h-1,y+x+c,x-c,k+x-c)\)。可以发现 \(k\) 这一维其实是 \(y\) 这一维历史上所有状态的和,所以 \(y\)\(k\) 都是 \(O(k)\) 量级。\(h\)\(O(\log n)\) 的,这是因为这个东西本质上是个 AVL 树。直接做大概是 \(O(nk^3 \log n)\) 这样的。

然后你考虑从叶子开始往上。假设最后有 \(x\) 个叶子,有 \(y\) 个点满足其有一个儿子为空另一个儿子不为空,即子树深度为 \(-1\) 的点数。则 \(2x+y-1=n\),原因是一棵每个点都有两个儿子的二叉树若有 \(c\) 个叶子则有 \(2c-1\) 个节点。对于原树,把 \(y\) 个点也算进来后减 \(y\) 就得到 \(n=2(x+y)-1-y=2x+y-1\)

现在枚举 \(y \leq k\),得到了 \(O(k)\) 个状态。考虑倒着如果倒着做,\((x,y,k)\) 怎么向前推 \((x',y',k')\)。枚举 \(c\) 后有 \(x'-c=y\),故 \(x'=y+c\),由 \(y'+x'+c = x\)\(y'=x-x'-c=x-c-(y+c)=x-y-2c\)。而 \(k=k'+x'-c=k'+y\)\(k'=k-y\)。故 \((x',y',k')=(y+c,x-y-2c,k-y)\)。我们有 \(x-y-2c \geq 0\),所以 \(c \leq \dfrac{x-y}{2}\)\(x'=y+c\leq y+\dfrac{x-y}{2}=\dfrac{x+y}{2}\leq \dfrac{x+k}{2}\)。注意到每次 \(x\) 近似于除以 \(2\),最多只会多个 \(\dfrac{k}{2}\),所以状态数上界应该是 \(O(k^3 \log n)\) 的,转移复杂度 \(O(k^2)\),原因是里面其实还带个组合数需要计算,总复杂度 \(O(k^5 \log n)\),出题人说过了那就是过了。

72 P13990

这显然是个基环树,那你直接对每个子树维护所有存在的点的深度做启发式合并就做完了。

73 P14068

对塔做 DP。\(f_i\) 表示前缀答案,转移考虑枚举上一个 \(j\),需要计算区间 \([j,i]\) 的权值。每个塔对应的是一个上凸的 \(+1\)\(-1\) 斜率拼接状物。这个东西是容易预处理的。

74 P13342

你要做的就是 kruskal 重构树上求这些点两两 LCA 的并的点权和。

这玩意你考虑怎么做。对于每个点 \(u\),什么样的区间 \([l,r]\) 不会算到这个点,当且仅当区间内只存在左子树或右子树但却不存在另一侧的,或者压根就不包含这个子树内的任何一个点。这个和 NOIP T4 的那个启发式合并做法很像。你维护每个点子树内的编号连续段,然后启发式合并就行。总共得到 \(O(n \log n)\) 个关键区间,之后的问题是简单的,复杂度 \(O(n \log^2 n)\)

75 P13523

先将序列全都减去极大值,然后询问都是加正数。

\(f_i\) 表示长度为 \(i\) 的区间最大和,则答案为 \(\max \limits_{i} \{f_i+xi\}\),只需要保留 \((i,f_i)\) 构成的凸包就行。

怎么求 \(f\) 构成的凸包呢。考虑分治。对于 \([l,mid]\)\((mid,r]\),算出每个前后缀和,由于只需要求 \(f\) 的凸包所以你也只需要保留前后缀和中的凸包,然后做闵可夫斯基和就行,就是你把差分的向量按照斜率归并。这个闵和可以线性求,总复杂度 \(O((n+q)\log n)\)

这个题数据很菜。我把闵和换成 \(O(n^2)\) 的暴力 \((\max,+)\) 卷积都过了。

76 NFLS 模拟赛 T1

把关系建成 DAG,拓扑排序即可。

77 NFLS 模拟赛 T2

难点在于删点最短路。

这个做法很多。最简单的做法应该是你直接做 LIS 计数,模质数后判定结果是否等于全局 LIS 个数即可。

也有确定性做法,你按值域从小到大加点维护前缀和后缀 LIS,加入一个点是不难做修改的。

78 NFLS 模拟赛 T3

看着就是关于 \(k\) 凸的。wqs 二分然后做反悔贪心即可。

关于为什么是凸的。考虑费用流。\(S\) 向每个点连 \((1,a_i)\),每个点 \(i\)\(i+1\)\((+\infty, 0)\)。每个点向 \(T\)\((1,b_i)\),流量为 \(k\) 的最小费用流就是答案,所以是凸的。

79 NFLS 模拟赛 T4

注意到答案为第一棵树上存在但第二棵树上不存在的边数。每次删掉这样的一条边将树变为两个连通块,第二棵树上必然有一条在这两个连通块之间的边。直接做是 \(O(n^2)\) 的。上个 LCT 容易通过。

当然有不用 LCT 的做法。你考虑两棵树都以 \(1\) 为根,对于第一棵树上每个点,若其与父亲的边第二棵树上不存在,就断开这条边加入这个点与第二棵树上的父亲的边。但有个问题是第二棵树上这个点的父亲有可能目前是这个点的儿子。为了避免这种情况,倒着从叶子往上删。每次删去一个叶子和其父亲的连边,加入其在第二棵树上父亲的边,然后在第二棵树上将这个点与其父亲合并。正确性不难说明。复杂度是 \(O(n \log n)\) 的。

80 P13526

\(O(n^2)\) DP 是简单的。

由于第二维是和子树深度有关,自然思考能否直接使用长剖。直接做有一个问题是,添加 \(u\) 和父亲的边权 \(w_u\) 时,转移形如 \(f_{i+1} \gets f_i+w_u\),这个并不是很容易直接做。如果有凸性就有说法了,于是猜一手其就是凸的。

猜出来了就做完了。合并是形如 \(a_i+b_j\rightarrow c_{\max(i,j)}\),要求 \(i+j \leq k\)。不妨假设现在合并 \(a_{0,\cdots,n}\)\(b_{0,\cdots,m}\)\(n\leq m\),把 \(b\) 前后 \(m\) 个数拉出来暴力求值,中间的变化量是一样的。用multiset 即可直接维护差分,根据长剖理论,复杂度是 \(O(n \log n)\) 的。

凸性的证明应该是对 DP 数组归纳。

81 P13531

一年前做过,现在看来,这个题还是很有趣的。

自然的思路是建出 ACAM 后每个点对应一条到根链,但是这个结构并不容易进行刻画,原因是询问有 \(l,r\) 两个限制,并且每个点对应一条链的结构还是太难直接做了。

一个常见的转化方式是,尝试将区间查询改成前后缀形式。比如说记 \(s_i\) 表示 \([1,i]\) 答案。则 \(s_r - s_{l-1}\) 再减去所有 \(a < l, b \in [l,r]\) 的区间 \([a,b]\) 即为答案。

找到满足 \(a<l\)\(b\in [l,r]\)\(b\) 最大的,则右端点在 \([b+1,r]\) 内的区间答案就是 \(h_r-h_b\)。对于右端点在 \([l,b]\) 的,其相当于询问 \(s\) 中一个给定串的一个后缀中有多少子串符合条件。倒着建 ACAM 就行。最后这一步相当巧妙,其本质是尝试将任何一个询问放到现有的给定的串上做询问,从而降低本质不同询问的数量。

82 NFLS 模拟赛 T1

枚举 LCP 就行。

83 NFLS 模拟赛 T2

这个题感觉有点难啊,不懂为什么过了这么多。

整个选的区间形态是一开始有个 \([l,r]\),然后每次选一个 \([a,b]\) 使得 \(a \leq r+1\)\(b \geq r+1\)

尝试对这个过程做 DP。对于一个方案我们会选定一个打通区间的子段 \([x,y]\),获得 \(\sum \limits_{i=1}^x a_i + \sum \limits_{i=x}^y b_i + \sum \limits_{i=y}^n c_i\) 的收益。考虑上述选的区间为 \([l_1,r_1],[l_2,r_2],\cdots,[l_k,r_k]\),则 \(y \in [r_{k-1},r_k]\)。我们对前 \(k-1\) 个区间做 DP,枚举最后一个区间,就容易算出答案。

有一个问题是 \(k=1\),这个时候相当于要对于每个区间 \([l,r]\) 计算 \([x,y] \subseteq [l,r]\) 的答案。这个扫描线一下就行,不太难。

84 NFLS 模拟赛 T3

点分治优化建图板子。

85 NFLS 模拟赛 T4

目标是求补图的 MST。

考虑补图每条边 \((u,v)\) 边权是重构树树上 LCA 点权。按照 Kruskal 的过程按照权值小到大加入,那么相当于 Kruskal 重构树上从下往上做。我们直接维护每个子树合并后得到的若干个连通块,那么每次就是尝试把左子树和右子树连通块合并。事实上你直接暴力枚举较小子树连通块内每个点,枚举右子树连通块,然后直接暴力做合并。这个的复杂度是可以分析到 \(O(n \log n)\) 的,如果你能精细实现到不用 \(\log\) 数据结构做合并那就是一个 \(\log\) 的,多一个 \(\log\) 也可以通过。

复杂度分析是你考虑当且仅当一条边在原图存在且被枚举到才会导致复杂度爆。这个东西分析一下可知确实是对的。

86 P11994

值域小肯定是有意义的,不妨考虑从值域上入手。

对于每个 \(x\),找到所有 \(a_i=x\) 的位置,选为负数的是一段后缀。且不难注意到随着 \(x\) 增大,如果有一个 \(x\) 被选,则其后面比 \(x\) 小的数也被选了,不然你可以把这个数删掉替换成后面那个小于 \(x\) 的数。

这引发了一个贪心策略,从小到大依次枚举 \(x\),选择能选的尽量长的后缀。正确性是考虑调整法。

考虑怎么维护这个贪心过程。在外层枚举 \(x\),对于每个询问尝试二分出最长选的后缀。判定时,由于其之后小于 \(x\) 的数一定会被选择,所以从被选位置开始的一段最小前缀和是不难预处理出来并做区间 RMQ 的。而询问左端点到被选位置的和也不难算出。复杂度 \(O((n+q)V\log n)\)

87 P13345

这个题是有点说法的。

首先最终顺序已知,不加思考地直接从前往后记 DP 的话怎么说都只能做到 \(O(nm^2k)\)。一个瓶颈是你要对每个人做一个值域为 \(O(mk)\) 的背包,彻底倒闭了。

不妨假设所有人分数两两不同,然后考察什么情况下能得到目标排列。

显然每个人删去一些得分后,我们得到了其的一个得分区间 \([l_i,r_i]\),限制基本上就是要求两两无交,有时可以在端点相交,取决于编号顺序。

这里有一个很厉害的观察,你发现整个数轴长度为 \(mk\),每盖掉一个位置,对应那个人区间长度增加 \(k\)。相当于是说你最多盖掉 \(m\) 个位置,不然肯定有相交。

然后考虑从前往后 DP。\(f_{i,j}\) 表示考虑到第 \(i\) 小的得分,之前盖掉 \(j\) 个数,\(r_i\) 的最小值是多少。转移枚举 \(i+1\) 盖掉多少个位置,预处理 \(i+1\) 这个人选 \(i\) 个位置和为 \(j\) 是否可行。这个地方看起来也要做 \(n\)\(O(mk)\) 的背包,但显然要求 \(j\) 不超过 \(i,i+1\) 得分差。而总得分差是 \(O(mk)\) 的,所以复杂度其实是 \(O(m^3k)\) 的。

这样的话背包部分是 \(O(m^3k)\)。外层 DP 转移先枚举前 \(i\) 个删了多少再枚举 \(i+1\) 选的个数那就是 \(O(nm^2)\) 了。

我们其实可以做到更优。注意到外层 DP 瓶颈是你不仅要枚举 \(i,j\),还要枚举下一个人的状态。干脆只枚举下一个人的状态,也就是枚举下一个人的左端点和选的数量。所有人的总枚举量是 \(O(m^2k)\) 的,而对 \(i\) 这个人你只需要双指针扫过去就行。总复杂度 \(O(nm+m^3k)\)

说到底这个题精髓还是在于把分数投影到数轴上,得出 \(\sum s_i-s_{i-1} = O(mk)\) 的限制,从而将背包的状态数减小到与 \(n\) 无关。

88 P12639

这个题的想法相对自然,由于你要对所有点进行排列,而你关心相对顺序,一个比较自然的 DP 是 \(f_{i,j}\) 表示 \(i\) 子树内,点 \(i\) 的排名为 \(j\) 的方案数。转移合并子树时,枚举一侧有多少个点在之前的根之前,后面的在根之后。记录一下前后缀和就可以做到 \(O(n^2)\)

当然也有一些别的做法。由于这个过程看起来像树的拓扑序,难点是有两种边,所以考虑对某类边容斥变成只有另一类边的森林拓扑序计数,同样可以 DP 的时候进行容斥。复杂度同样也是 \(O(n^2)\)

89 P12765

去年 NFLS 模拟赛的题怎么又出现了。

我当时写的做法是,声称若存在长度为 \(x\) 的区间,则必存在 \(x-1,x-2,\cdots,x-6\) 中某种长度也出现过。我已经不会证明了,或者是当时也没证明过。不过这个题目的性质其实远比这个强。

题解区有一个高妙的做法。我们考虑三个前缀和序列 \(a_i,b_i,c_i\),求 \(r-l\) 最大的 \(l,r\) 使得 \(a_r - a_l \neq b_r - b_l, a_r - a_l \leq c_r - c_l, b_r - b_l \neq c_r - c_l\)。令 \(x_i = a_i - b_i, y_i = a_i - c_i, z_i = b_i - c_i\)。则要求 \(x_l \neq x_r, y_l \neq y_r, z_l \neq z_r\)

如果只有两维怎么做。每个点 \((x,y)\) 相当于占领了一条横线和竖线。按照 \(r\) 扫描线,维护可能有意义的所有点。对于任意一个点,与其 \(x\) 坐标相同的点最多一个。所以本质上只有 \(O(1)\) 个有用的点。三维是类似的。

90 P14231

经典套路,对相邻两个数和小于等于 \(k\) 进行刻画,可以将小于等于 \(\lfloor \dfrac{k}{2} \rfloor\) 的视作 \(0\),大于 \(\lfloor \dfrac{k}{2} \rfloor\) 视作 \(1\),则相邻 \(0\) 可以随便选,相邻 \(1\) 不能同时选,\(0,1\) 相邻则有限制。显然会取所有 \(0\),以及符合条件的 \(1\)

\(k\) 扫描线可以求出若干贡献,查询 \([l,r]\) 形式是 \([l',r'] \subseteq [l,r]\) 求和。整体二分是 \(O(n \log^2 n)\) 的。好像还能 \(1\)\(\log\),我不会。

91 ARC186D

考虑双射转化。一个合法序列可以双射成一棵 \(n\) 个点的有根树,\(a_i\) 表示 DFS 序第 \(i\) 个点的儿子个数。

故序列 \(a\) 合法当且仅当:

  1. \(\sum \limits_{i=1}^n a_i = n - 1\)
  2. \(\forall 1 \leq i < n, \sum \limits_{j=1}^i a_j \geq i\)

同时成立。

枚举 LCP,枚举 LCP 下一位选的数是 \(x<a_{i+1}\),不难将序列计数转化为格路计数,形式是反射容斥的形式。注意到 LCP 为 \(i\) 则要求 \(\sum \limits_{j=1}^i a_j < n\),故总复杂度 \(O(n)\)

92 QOJ7649

\(m\) 很大,但显然我们只关心元素相对顺序。记 \(f_{i,j}\) 表示长度为 \(i\) 值域为 \(j\) 的序列个数,\(g_{i,j}\) 表示长度为 \(i\),每个数范围 \([1,j]\),且 \([1,j]\) 每个数都出现过的序列个数。\(g\) 不难由 \(f\) 二项式反演在 \(O(n^3)\) 复杂度内得到,问题难点变为求 \(f\)

考察序列的前缀最大值,不难发现前缀最大值把整个序列分段后,每一段的值域确定。对于 \(f\) 的转移,考虑枚举最后一个前缀最大值位置即可。复杂度 \(O(n^4)\)

询问时,枚举序列本质不同数的个数即可。总复杂度 \(O(n^4+qn)\)

93 CF1276F

基于 \(\texttt{*}\) 在子串中的位置进行分类,只有形如 \(s+\texttt{*}+t\) 的形态是相对困难的。

对于这个问题,考虑在 SAM 上枚举 \(s\),考察可行的 \(t\)。注意到对于 \(\mathrm{Endpos}\) 相同的 \(s\),其可能的 \(t\) 也相同。事实上,令 \(S\)\(s\)\(\mathrm{Endpos}\) 集合,则 \(t\) 应该是原串所有 \([i+2,n]\) 后缀的所有前缀的并,其中 \(i \in S\)。原因是由于 \(\texttt{*}\)\(s\) 后,所以 \(i+1\) 就被改成了 \(\texttt{*}\)\(t\) 就是从 \(i+2\) 开始的一段前缀。

尝试考察一个集合 \(T\) 的所有 \(i \in T\)\([i,n]\) 的前缀并大小。这显然等于将他们按照字典序排序后总长减去相邻两项 LCP。求出后缀树组后在 SAM 上线段树合并维护即可,复杂度 \(O(n \log n)\)

94 NFLS 模拟赛 T1

这个结构是有向基环树,但显然 \((x,y)\)\((y,x)\) 是一样的,所以你不关心边的方向。\(x,y\) 合法充要条件是加边后图依然是基环树森林。并查集维护即可。

95 NFLS 模拟赛 T2

为啥模拟赛有计算几何啊,吐了。

做法就是,你把每条给定直线按照在询问直线上的交点横坐标排序,只需要考虑相邻两条直线,调整法不难证明。

96 NFLS 模拟赛 T3

离线扫描线,每个点 \(i\) 维护其对应左边最小的位置。KDT 做即可。KDT 常数太大过不去,不过复杂度是对的。

97 NFLS 模拟赛 T4 / 洛谷 P9997

首先询问的时候把跨过 LCA 的单独计算。现在变为祖先链查询。

然后大概就是说你做树剖,跨过重链的不难计算,重链内部的每次修改时对里面 \(O(x)\) 个位置重构,算一下哈希值放哈希表里应该就对了。

98 ARC188D

这个题场上为啥过这么少啊。

首先他告诉你了 \(a\) 的排名,所以不妨令第 \(i\) 个序列第一个数就是 \(i\),要求 \(a_i \in [2i-1,2i]\)。令 \(c_i = a_i \bmod 2\)

\(c_i=0\) 时,说明最后一个数为 \(i\) 的那个序列的反串比这个序列小,即那个序列的第二个位置比 \(i\) 的第二个位置小。反之,\(c_i=1\) 说明那个的第二个比这个大。

所以对于 \(b\) 确定后,每个编号 \(i\) 会和编号 \(x_{i,3}\) 的序列产生限制,要求第二个数比其小或大。\(b\) 合法当且仅当连边后不会构成环。

由于 \(x_{i,3}\) 是排列,所以将有向边看作无向边后,整个图由若干环构成。而原限制在有向图上。一个无向环在有向图上也是环当且仅当环上所有 \(c\) 同色。

即求有多少方案使得不存在同色环。

对于原始给定的若干 \(b_i\),我们直接连边 \((i,b_i)\),每个连通块现在是环或链。进一步,环必须要是非同色,否则答案为 \(0\)。环没有任何意义,将环都删掉。然后每条链可能是全白,全黑或双色。这些链显然等价于一个点。对同色环做容斥,钦定 \(c\) 个环同色,容斥系数 \((-1)^c\),然后环外的点若有 \(k\) 个则方案数是 \(k!\),故我们只关心被钦定成环上的点的个数。对黑白分别 DP 后类似卷积合并即可。DP 类似第一类斯特林数,\(f_{i,j}\) 表示前 \(i\) 个点做容斥,有 \(j\) 个点在环上的所有结果和。转移直接考虑插入进某个环或产生新环或不钦定其在环上。复杂度 \(O(n^2)\)

99 P13078

一棵树是 MST 当且仅当每条非树边大于树上相应路径的任意一条边。

从前往后贪心,确定非树边答案时优先把对应路径上所有边确定答案,树上并查集维护即可。

100 P12573

这个题很容易吗。

\(q=1\) 时,建出 Trie,相当于从根开始每次往任意一个儿子走,如果两个儿子有一侧为空则可以获得 \(2^i\) 的收益。最大化收益和。直接 DP 即可。

反过来,这等价于从任意一个叶子节点出发到根,对于每个点若其没有兄弟则获得 \(2^i\) 的收益。问最大收益。

先对全局建 Trie,对于每个 \(i\) 来说,考虑其被的所有祖先什么时候会产生贡献。对于其兄弟子树求出前驱后继分别为 \(x,y\),则只有 \([l,r] \subseteq (x,y)\) 时这个子树会为空。

\(m\)\((x,y)\) 会产生 \(O(m^2)\) 个本质不同区间,现在形如有 \(O(nm^2)\) 个区间 \([x_i,y_i]\) 和权值 \(v_i\)\(q\) 次查询给定 \(l,r\),求 \(\max \limits_{[l,r]\subseteq [x_i,y_i]} v_i\)。扫描线将问题转化为 \(O(q)\) 次区间查询最大值,\(O(nm^2)\) 次单点修改。可以分块平衡之,复杂度 \(O(q\sqrt n+nm^2)\)

101 炼石 NOIP R15T1

难点在于想到二分,然后直接贪心就行了。

怎么想到二分呢,我觉得有点难。

102 炼石 NOIP R15T2

我觉得这个题就是很难,怎么会过这么多。

把偶数位字符反转,则操作就是选定 \(i\),然后 \(x_i \gets x_{i+1}\)

所以整个序列相对来说变得越来越稳定。对于任意一个后缀 \([i,n]\)\(x\)\([1,i]\) 连续段数必然要大于等于 \(y\) 中对应连续段数,否则不可能成功操作。此外,要求 \(x_n=y_n\)

这确实是充要条件,线段树维护即可。

感觉这个题难点是为什么会想到偶数位反转,这个东西还是很巧妙的。这个题并不仅有这个东西是不变量,你把序列做异或差分也能得到一个不变量,但那个结论并不能推出充分性。这个过程感觉很奇怪。

103 炼石 NOIP R15T4

这不是我们 P12768 吗。

套用这个题做法就行。但其实也可以不用,这个题没卡空间,优化建图直接就能过。

104 NFLS 模拟赛 T1

二分答案 \(k\) 后,找到任意一个子树深度恰为 \(k\) 的点,则必选中这个点。对剩下的部分做换根 DP 即可。

105 NFLS 模拟赛 T2

注意到你不需要记乘积 \(s\) 而只需要记 \(\lfloor \dfrac{n}{s} \rfloor\),所以复杂度是 \(O(rc\sqrt{n})\) 的。

106 NFLS 模拟赛 T3

有结论:若一个 \(k\times k\) 正方形为拉丁方,则对于任意 \(i > \dfrac{n}{2}\),其左上角的 \(i \times i\) 矩形不是拉丁方。

首先考虑如何判定一个正方形是否合法。每个点处理向下和向右最远位置使得没有重复数字,而恰有 \(k \times k\) 个只需要做个集合哈希即可。现在我们可以 \(O(1)\) 判定一个矩形是否合法。

对于原问题,枚举正方形左上角 \((i,j)\),考虑阈值 \(B\)。对于 \(k \leq 2B\) 的,直接枚举并判定。对于 \(k > 2B\),每个 \([xB,(x+1)B)\) 中至多一个 \(k\) 合法。且注意到若 \(k=cB+l\) 合法,则这个 \(k\times k\) 矩形内所有数的集合与 \(x \in [i,i+cB-1],y \in [j,j+B-1]\) 的长方形数的集合相等。这本质上就是之前结论的进一步推广。所以只需要判定 \(O(n^{2.5})\) 个矩形即可。复杂度 \(O(n^{2.5})\)

107 P13757

\(\geq\) 是好做的,考虑减去存在 \(x\in S,y\notin S, a_x=a_y\) 的情况。

显然若存在,则 \(S\) 内有且仅有一个非空集合 \(P\)\(S\) 外有且仅有一个集合 \(Q\),满足 \(P\cup Q\) 内任意两个序列相等。对此考虑容斥。

枚举钦定 \(|P|=x,|Q|=y\),容斥系数 \((-1)^{x+y}\),每个位置贡献是一样的,所以答案是 \(g^m\)\(g\) 是每一个数有多少种方案。\(g=\sum \limits_{i=1}^v i^{x}(v-i+1)^{n-k-y}\)

问题变为快速对于所有 \(x,y\) 计算 \(\sum \limits_{i=1}^v i^{x}(v-i)^y\)

考虑递推。边界 \(x=0\)\(y=0\) 是自然数幂求和,拉格朗日插值即可。当 \(x,y > 0\) 时。注意到 \(i^{x}(v-i)^y=i^x(v-i)^{y-1}(v-i)=vi^x(v-i)^{y-1}-i^{x+1}(v-i)^{y-1}\),对此递推即可,复杂度 \(O(n^2 \log m)\),瓶颈在于快速幂。

108 P14256

形式化地考虑数分别是 \(0,1,2\)\(0\) 击败 \(1\)\(1\) 击败 \(2\)\(2\) 击败 \(0\)

首先相邻两个相等一开始就能操作,现在考虑相邻两项不同。

考虑原序列模 \(3\) 意义下的差分 \(s_i = (a_i - a_{i-1}) \bmod 3\)。则不难看出操作等价于:

  1. 选择相邻两个 \(1\),将其变为一个 \(2\)
  2. 选择相邻两个 \(2\),将其变为一个 \(1\)
  3. 选择相邻的 \(1,2\),将其删去并获得 \(1\) 的收益。

据此引出一个从前往后贪心的算法。由于只有 \(1,2\) 能产生贡献,所以没有匹配的 \(2\) 必然要两两合并,剩下 \(0\) 个或 \(1\) 个。所以总是形如 \(21\cdots 1\)\(1 \cdots 1\),记录 \(1\)\(2\) 的个数即可贪心。

对于原问题,将 \(1,2\) 个数以及目前末尾数是什么加入状态中即可。复杂度 \(O(n^2)\)

109 QOJ14573

直观的想法是询问一些特殊图。询问链可以获得 \(\sum a\),询问以 \(i\) 为中心的菊花可以获得 \(a_i\) 加上除了 \(i\) 的最大两个数。

询问上述信息,共 \(n+1\) 次。令 \(b_i\)\(a\) 排序后第 \(i\) 大,则通过分析每个 \(i\) 在询问中的贡献不难得到 \(b_1+b_2\),据此可以确定每个点的点权。但题目要求你必须找到不能确定的位置,也就是你要找到 \(a\) 最大的两个位置。

\(f(i)\) 表示询问以 \(i\) 为中心的菊花返回的结果。考虑所有使 \(f(i)\) 取到最大值的 \(i\),则 \(a_i\) 的取值必然是 \(b_1,b_2,b_3\) 之一。令 \(S\)\(f(i)\) 取到最大值的 \(i\),我们的目标是在其中找到两个特殊点,使得其分别对应 \(b_1\)\(b_2\),而 \(S\) 中其他数都是 \(b_3\)

首先根据之前的询问,\(b_3\) 是确定的。令 \(T = \overline{S}\),不妨设 \(|T| \geq 3\),此时存在一种二类询问能做到给定 \(A,B,C\),判定两个特殊点是否恰好分别属于 \(A,C\)。我们把 \(T\) 的点拉成一条链,把 \(A\)\(C\) 挂在链左右两侧,把 \(B\) 挂在中间。则当且仅当直径长度为 \(\sum a_i - b_3\times c\) 时两个点分别处于两侧,\(c\) 是对应的那个数量,算一下就行。这是因为如果在同侧或有一个在 \(B\) 中则直径必然不可能有这么长。

枚举二进制位尝试区分两个特殊点。枚举到某位后得到两个集合 \(A,B\) 将特殊点划分开来,对于 \(A,B\) 分别再枚举对应二进制位尝试找到特殊点即可。次数在 \(2 \log_2 n\) 以内。

\(|T|<3\) 时,依次枚举 \(S\) 中每个数,判定其是不是特殊点,不是则加入 \(T\),直到找到两个特殊点或 \(|T| \geq 3\)

110 P11988

每次定向后如果得到的不是 DAG,则大小大于 \(1\) 的 SCC 对你来说肯定是不优的,这样你得到的信息很少。

所以不妨考虑将限制强化成每次都定向为 DAG。

如果找到了一种定向能从 \(s\) 到达 \(t\),则将 DAG 的拓扑序拉出来,我们可以通过一次询问判定 \(s,t\) 的拓扑序属于 \([l,r]\) 是否成立,方法是只保留两端都处于 \([l,r]\) 内的边,将其他边反转。据此我们可以在 \(2 \log_2 n\) 次询问内得到 \(s,t\)

对于原问题,难点变为找到一个定向使得 \(s\) 能到 \(t\)。显然图越稀疏越难做,考虑树怎么做。一个想法是点分治,每次找出重心后,枚举二进制位将所有儿子划分进两个集合,这样每个重心询问次数是 \(O(\log n)\),总次数 \(O(\log^2 n)\),考虑选重心后,从小到大加入邻居子树使得两个集合都在 \([\dfrac{1}{3},\dfrac{2}{3}]\) 之间,这显然能构造出来。这个做法和三度化后边分治是类似的。次数大概是 \(2(\log_2 n + \log_{1.5} n)\)。肉眼可见的卡不满。

对于图的问题,随便找一个生成树。定向时,将树定向的结果拓扑排序,然后非树边从小往大连即可。

111 炼石 NOIP R16T1

猜测贪心做法是每次删掉最靠后的符合条件的位置,实则确实如此。复杂度线性。

112 炼石 NOIP R16T2

同余最短路转圈技巧普及题。这里描述一下这个过程。

一般同余最短路问题中,我们令 \(m\) 为选取的模数,此题中有 \(m=a_1\)。将每个数 \(x\) 写为 \(x=km+b\),观察到若 \(x\) 被表示,则 \(x+m\) 也可以。记 \(f_i\) 表示 \(b=i\) 时最小的能被表示的 \(x\),构造图 \(i \xrightarrow{a_j} (i+a_j) \bmod m\)\(f_i\) 即为最短路。

按照一般最短路的求法,我们只能做到 \(O(nm \log m)\) 求解整个图,而本题我们希望 \(O(nm)\) 求解每个前缀答案。这时引入转圈技巧。我们考虑加入每个 \(a_j\) 时,会加入所有 \(i \xrightarrow{a_j} (i+a_j) \bmod m\) 的边,构成了 \(\gcd(a_j,m)\) 个环。不难注意到每个环上最短路不可能经过多次同一个点,所以对这个环松弛两遍就可以得到答案。复杂度 \(O(nm)\)

113 炼石 NOIP R16T3

每个区间答案肯定形如一些 \(\texttt{A}\),一些 \(\texttt{B}\),……,一些 \(\texttt{Z}\),加上一个原串的区间。这不难通过枚举 \(\Sigma\) 中的所有字符在 \(O((n+q)|\Sigma|\log n)\) 的复杂度内求出,然后哈希或者后缀数组就可以比较两个的字典序。

\(O(n|\Sigma|\log n)\) 太大了,可以优化到 \(O(n|\Sigma|+q|\Sigma|\log n)\),足以通过。

114 炼石 NOIP R16T4

首先 SG 值大概是 \(f_u = \mathop{\mathrm{MEX}} \limits_{j \in \mathrm{subtree}_u} \{f_j \oplus ((d_j-d_u-1)\bmod 2)\}\)

考虑这个结构,我们首先观察到,\(\lfloor \dfrac{f_u}{2} \rfloor\) 从叶子到根单调不降。其次,每个点的 \(f_u\) 只和儿子的最大值和严格次大值有关。若最大值和严格次大值分别是 \(2k+1\)\(2k\),则 \(f_u=2k+2\),否则 \(f_u\) 为最大值异或 \(1\),原因稍微分析一下就行。

注意到 \(f_u\) 的量级是 \(O(\log n)\) 的,所以事实上一条链上儿子最大次大分别是 \(2k\)\(2k+1\) 的点数也只有 \(O(\log n)\),对此使用数据结构维护一些信息就能查询了。直接树上倍增可能是有前途的,树剖也很有前途,我也没研究明白细节。

115 P14230

首先大家都会贪心匹配子序列。

整个过程分为两部分,分别是内层子序列和外层子序列。对内层子序列 DP,\(f_i\) 表示内外层贪心都选到 \(i\) 的答案。转移枚举下一次内层转移到 \(j\),计算 \(i\)\(j\) 有多少本质不同子序列在到 \(j\) 前没有选过等于 \(a_j\) 的数,记作 \(g_{i,j}\),那么有 \(f_i \times g_{i,j} \rightarrow f_j\)。只要能快速算 \(g\) 就能求解原问题。

对于 \(g\),考虑先算 \(h_{i,j}\) 表示从 \(i\)\(j\) 但没有 \((i,j)\) 间不选等于 \(a_j\) 的限制的方案数。这个容易 \(O(n^2)\) 计算。则 \(g_{i,j}\) 可以通过枚举最后一次选等于 \(a_j\) 的位置 \(k\) 并减去 \(h_{i,k} \times g_{k,j}\) 计算而来。复杂度 \(O(n^3)\)

这个求 \(g\) 的做法前途不太好,考虑不要显式计算 \(g\),而是把贡献过程直接刻画在 \(f\) 转移中。从 \(i\)\(j\) 相当于要求不经过 \(=a_j\) 的数。记 \(w_{i,j}\) 表示目前结尾为 \(i\),要求不经过等于 \(j\) 的总权值和。对相同的 \(j\) 记录 \(w_{i,j}\) 的前缀和即可在 \(O(n^2)\) 内解决整个问题。空间也是 \(O(n^2)\) 的,但已足以通过。

116 NFLS 模拟赛 T1

每种颜色单独做,按照 \((x,y)\) 二元组递增顺序考虑,树状数组做一下即可。复杂度 \(O(n^2 \log n)\)

117 NFLS 模拟赛 T2

有一些基于直接维护等差数列连续段的做法,每个连续段被完全覆盖则个数会减半,据此可得一个 \(O(n\log^2m)\) 的做法,太蠢了。

注意到我们可以快速计算操作 \([l,r]\) 后第 \(x\) 个位置在这次操作前是第几个位置。具体来说,分类讨论 \(x\) 之前是 \([1,l),[l,r],(r,n]\) 中哪一部分即可。

倒着做,每次向平衡树中插入询问的值,然后按照操作区间对平衡树做分裂并支持维护乘法和加法,分裂后合并回去即可。

时间复杂度 \(O(n \log n)\),空间线性。

这个做法其实类似于插入标记回收的那套做法,不过你不需要做有交合并,因为你把区间分裂出来后操作仍然是三部分有序的而不会值域有交。

118 NFLS 模拟赛 T3

注意到每个左端点至多对应一个右端点,只需要二分出来即可,问题变为 \(O(n \log n)\) 次查询子串排名。

先做后缀数组,则询问的是后缀树上一段到根链的排名。找到这条到根链向下的最靠左的链,变为查这条链右侧点数,直接做即可。复杂度 \(O(n\log^2 n)\)

119 NFLS 模拟赛 T4 / QOJ5175

考虑到这些最短路的并就是最短路树,这个结构类似于斯坦纳树,考虑状压 DP。

\(f_{i,j,S}\) 表示 \(i\) 子树内,进行了 \(j\) 次操作,已经选定了 \(S\) 这个特殊点集合的情况下的答案。转移分为往父亲接,或者在同一个 \(i\) 处合并 \(S,T\) 变为 \(S \cup T\)

直接做复杂度 \(O(nm^23^k)\),瓶颈在于合并 \(S,T\)。但不难注意到 \(f_{i,j,S}\)\(S\) 固定时,随着 \(j\) 单调递增,\(f\) 值单调不增。而合并是取 \(\max\),所以不难做到 \(O(nm3^k)\)

120 P11983

这是好题啊!

对于字典序问题,一个想法是逐位贪心,但对于一个区间确定了最大值后,你不容易确定最大值在哪,所以不是很有前途。

考虑另一种思路,从大到小枚举最大值,从前往后枚举区间使得尽量多的区间的最大值为枚举的数。

具体来说,我们枚举每一个数 \(i\),记其出现了 \(c\) 次,然后从前往后扫描每个区间,并维护目前哪些区间最大值会被选为 \(i\)。每次加入一个区间,要求这个新的集合的最小点覆盖不超过 \(c\)。不难发现不同的 \(i\) 之间不会互相影响,因为如果最小点覆盖的位置之前被其他某个 \(j>i\) 选了,那这个区间上一次也应该被选。至此我们已经得到了一个多项式复杂度算法。

假设最终确定了 \(k\) 个区间最大值为 \(i\),我们希望复杂度和 \(n\) 无关而和 \(k\) 有关,这样总复杂度就对了。

首先可以发现,只要最小点覆盖 \(<c\),则每次加入区间都必定成功,因为最小点覆盖至多增加 \(1\)。而当最小点覆盖恰好等于 \(c\) 后,之后加入的区间要满足加入后最小点覆盖不变。故整个选的过程是一段前缀和后面若干个散点。

对于前缀,直接的想法是二分。不过为了复杂度和 \(n\) 无关,考虑倍增二分。即从小到大每次尝试将目前前缀长度乘以 \(2\) 并做判定,这样我们判定的前缀长度不会超过答案前缀长度两倍。这部分的复杂度是 \(O(k \log^2 k)\) 的。

现在考虑之后加入的散点怎么做。为了研究清楚这个事情,你肯定要研究清楚对于一个集合 \(S\),加入什么区间 \([l,r]\) 会使得最小点覆盖不增加。不妨考虑原最小点覆盖大小为 \(k\),则相当于会有一个点序列 \(x_1,x_2,\cdots,x_k\),不难注意到每个 \(x_i\) 存在一个上下界 \([l_i,r_i]\),感性理解不难看出这些区间互不相交。这个 \([l_i,r_i]\) 是不难通过正反做两次贪心得到的。而加入一个区间 \([L,R]\) 可行当且仅当 \([L,R]\) 与某个 \([l_i,r_i]\) 有交。

考虑加入一个 \([L,R]\)\([l_i,r_i]\) 怎么变化。将 \([L,R]\) 按照与 \([l_i,r_i]\) 的关系分类。具体来说,将所有与某个 \([l_i,r_i]\) 有交的 \([L,R]\) 分类为,包含某个 \([l_i,r_i]\),恰与一个有交,或恰与两个有交。

包含某个 \([l_i,r_i]\) 是好的,其不会对任何 \([l_i,r_i]\) 造成影响。

恰与某个相交但不包含任意一个时,相当于 \([l_i,r_i]\)\([L,R]\) 求交。

而与两个相交,形如 \([l_i,r_i],[l_{i+1},r_{i+1}]\) 均与 \([L,R]\) 有交。你发现其并不会直接影响 \([l_i,r_i]\)\([l_{i+1},r_{i+1}]\),但如果某次求交后 \(r_i < L\),则 \(r_{i+1} \gets R\)。同理 \(l_{i+1} > R\)\(l_{i} \gets L\)

现在我们的目标就是,能通过某个结构维护最靠前的和某个 \([l_i,r_i]\) 有交的区间,那么第一类区间直接忽略,第二类对单个 \([l,r]\) 进行修改,第三类考虑把这个标记挂在 \(i,i+1\) 上,之后进行操作 \(2\) 递归执行标记操作。标记的总次数是 \(O(k)\) 的所以是对的。

现在考虑什么结构能求解最小有交编号。你发现第二三类都比较好,只会和一个或两个 \([l_i,r_i]\) 有影响。第一类比较难受,但由于 \([l_i,r_i]\) 无论如何都在缩小,所以你压根不需要找最小的 \([L,R]\),而是找到所有这样的 \([L,R]\),那么你只需要在修改 \([l,r]\) 时,把所有包含这个区间的 \([L,R]\) 拉出来就行了。而二三类就很容易用线段树做了。复杂度是两个 \(\log\) 的。

121 P11408

考虑朴素的 DP 结构,\(g_u = \max \limits_{j} \{g_j+w_j\}\),每个点的 \(f(u)\) 为儿子的最大和次大 \(g_j+w_j\) 的和。

对于每个点,称其实儿子为 \(g_j+w_j\) 最大的。整棵树被我们做了一个剖分。每个点的 \(f\) 为实儿子 \(g_j+w_j\) 加上虚儿子最大的 \(g_j+w_j\)

每次修改操作,由于加的是正数,从 \(u\) 开始往根不断跳,会有若干次切换虚实儿子的过程,直到无法操作为止。我们声称这么暴力跳链顶并判定这条链是否会成为父亲的实儿子,直到无法成为停止,\(n,q\) 同阶的情况下,总操作次数是 \(O(n \log n)\) 的。原因是我们将每条实链染一个颜色,每个点的颜色是所在实链的颜色,则操作相当于链颜色覆盖,我们的做法相当于暴力跳到祖先第一个颜色不同的位置,并把这一段染成同颜色。对原树重链剖分,我们的做法不弱于 \(O(\log n)\) 次区间染色,根据颜色段均摊理论即得均摊复杂度 \(O(n \log n)\)

现在我们只需要维护虚实链的更改。相当于是我们要维护一条实链整体加一个数,切换某个点的实儿子,查询某个点的实链链顶,查询单点值,维护每个点的虚儿子最大权值。

链加单点查可以直接树状数组。维护每个点虚儿子可以直接用 multiset。维护实链顶可以维护每个点是否为链顶,查询某个点向上第一个是链顶的点,树剖后可以轻松维护。总复杂度 \(O(n \log^2 n)\)

122 NFLS 模拟赛 T1

点边容斥,或者也可以视作平面图欧拉定理,直接做就行。

123 NFLS 模拟赛 T2

显然只有 \(2^c\) 种本质不同的颜色,这个问题可以先二分答案,然后做二分图匹配。则 Hall 定理要求答案为 \(k\) 要求 \(\forall S, \dfrac{|N(S)|}{|S|} \geq k\),则 \(k \leq \dfrac{|N(S)|}{|S|}\),所以不需要二分答案了。

进一步,怎么求每种颜色是否出现在链上。你只需要开个主席树在树上暴搜出来就行。复杂度 \(O(n\log n+q4^c+qmc)\)。卡一下常可能可以通过。

124 NFLS 模拟赛 T3

魔怔题。

不可行的相当于是排序后所有长度为 \(l\) 的前后缀和 \([s_1,s_2)\) 构成区间并的结果。

考虑求补集,也就是不包含于 \([s_1,s_2)\) 构成区间内的答案。相当于对某个 \(l\),最小的 \(l+1\) 个数的和大于最大的 \(l\) 个数和。

你发现这个 \(l\) 其实是 \([1,n]\) 的一个前后缀,证明是显然的,你二分出来就容易做到 \(O((n+q) \log^2 n)\)

125 NFLS 模拟赛 T4

先建立 AC 自动机,相当于在自动机上走,要求不能走到某个 Fail 树到根链上有字符串结尾的点。

\(f_{i,s,t}\) 表示,现在在 AC 自动机状态 \(s\),并且在末尾加了个 \(i\),要求走到状态 \(t\),问字符串长度最小值。

转移考虑对 \(b_i\) 从前往后逐个 DP,\(g_{i,j}\) 表示走完了 \(b_1\)\(b_i\),在 AC 自动机节点 \(j\) 的答案。

注意到结构形如最短路,类似最原始的 bellman-ford,直接做 \(O(G)\) 轮松弛就可以通过。

126 P10430

首先 \(q=1\) 大家都会做,先做操作 A,做完后序列合法当且仅当其单调不降。从后往前做贪心即可。

离线按照左端点扫描线。对于每个右端点维护目前的 \([l,r]\)\(l\) 这个位置要减去多少 \(D\)。显然随着 \(r\) 递增这个值单调不降。维护若干这个值的连续段,每次直接从前往后删连续段直到操作后 \(l+1\) 的值比 \(l\) 初始值小,这个段之后的变化量是相同的。线段树维护之,查询是区间历史和。复杂度 \(O((n+q)\log n)\)

127 P10432

好题。

首先,一个点如果增高了,则不可能新增连接设施。

考虑反证。点 \(x\) 增高,目的肯定是连向点 \(y\),初始 \(h_x \leq h_y\)。如果 \(C_y \leq C_x\),将所有向 \(x\) 连的都改为向 \(y\) 连,\(x\) 就不用新增连接设施了。如果 \(C_y > C_x\),初始时 \(x\)\(y\) 小,干脆不要增高 \(x\),让 \(y\) 直接连向 \(x\)。如果 \(x\)\(y\) 的是免费的,那就把某个本来指向 \(x\) 现在指向 \(y\)。这样肯定不劣。

其次,我们声称,最终的最小值点一定就是原来的最小值点。原因是如果原来最小值 \(x\) 增高后向 \(y\) 连边,尝试改为不增高 \(x\) 然后让 \(y\)\(x\) 连边。本来向 \(x\) 连边可以调整成向 \(y\) 连边,这样就不劣了。

据此,考虑按照值域 DP。将每个点海拔增加过程投影到数轴的区间上,\(f_{i,j,k}\) 表示考虑到了 \(i\),之前还有 \(j\) 个没用的连接设施,有 \(k\) 个区间跨越 \([i,i+1]\)。增加连接设施时,根据上述结论,不难看出我们直接令增加设施对应花费为初始高度 \(=i\) 的点的 \(C\) 最小值即可。直接做是 \(O(Hn^2)\) 的。优化是说,不难注意到如果某个 \(i\) 不存在 \(H\)\(i\) 的数,其转移可以直接向后做一个等差数列覆盖状物。只对有用的 \(i\) 做 DP,复杂度 \(O(n^3)\)

128 P10433

好厉害的题。

首先所有人基本独立,每个除了 \(1\) 的肯定希望走的尽量短。具体来说,其可以第一轮走到某个 \(0\),然后 \(01\) 交替每轮花费 \(2\),也可以先走若干轮走到一个 \(0\) 使得其存在一个相邻的 \(0\),然后每次都在这两个 \(0\) 之间走,花费 \(1\)

前者很容易计算,找到距离每个点最近的 \((0,1)\) 边即可。另一方面,其有可能走若干轮走到 \((0,0)\) 边,这个就有点麻烦了。考虑其走到这条边花了 \(k\) 次,距离为 \(d\),而整个过程中 \(1\) 号玩家移动了 \(x\) 步。如果 \(x \geq k\),则这个花费为 \(x-k+d\)。反之,\(x < k\) 时,其只在之前走了若干轮就停下了。我们声称也用 \(x-k+d\) 计算并不会让答案变小,这个是你把路径画出来手玩一下就能得到的。

现在每个点 \(i\) 在经历 \(x\) 轮的权值可以写作 \(\min(x+a_i,2x+b_i)\) 的形式。至此我们已经得到了一个多项式算法,直接跑分层图最短路即可。

现在考虑怎么优化这个过程。注意到 \(k\) 较大时,我们不希望轮数太多,因为每增加一轮答案至少增加 \(k-1\),故如果最少 \(x\) 轮,最多不会超过 \(O(x+\dfrac{n}{k})\) 轮,这样复杂度就是 \(O(\dfrac{n^2}{k})\) 了。

另一方面,\(k\) 比较小时,注意到每个点的花费是一个形如前面斜率 \(2\) 后面斜率 \(1\) 拼接而成,所有点总共只有 \(O(k)\) 个本质不同段,每段单独拉出来当作直线算答案,并且你发现斜率前面大后面小是凸的,所以当作直线算答案就是对的。

平衡可得复杂度 \(O(n\sqrt{n\log n})\)

129 P5479

正常求编辑距离的做法是,\(f_{i,j}\) 表示长度为 \(i,j\) 的前缀编辑距离。直接套用这个做法复杂度是 \(O(n^3)\) 的。

首先考虑对 \(B\) 的每个后缀单独做,由于 \(k\) 很小,我们希望得到一个关于 \(k\) 的状态。

现在我们考虑记目前正在处理的 \(B\) 后缀为 \(T\),原串 \(A\)\(S\),观察这样一个事实:对于固定的 \(j\)\(S[1,i]\)\(T[1,i+j]\) 的编辑距离大于等于 \(S[1,i-1]\)\(T[1,i+j-1]\) 的编辑距离。这是显然的。另一方面,显然两个编辑距离不超过 \(k\) 的串长度差不超过 \(k\),故自然的想法是对于每个 \(j\)\(x\),求出最大的 \(i\) 使得 \(S[1,i]\)\(T[1,i+j]\) 的编辑距离不超过 \(x\),我们记这个最大的 \(i\)\(f_{j,x}\)。这样状态数已经被优化到了 \(O(k^2)\)

进一步,考虑怎么对 \(f\) 进行转移。首先是替换,\(f_{j,x} + 1 \rightarrow f_{j,x+1}\)。其二是插入。\(f_{j,x} \rightarrow f_{j+1,x+1}\)。最后是删除,\(f_{j,x} + 1\rightarrow f_{j-1,x+1}\)。另外,在使用 \(f_{i,j}\) 更新后继时,先将 \(f_{i,j}\) 加上对应后缀的 LCP,这一步求出后缀数组即可。

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

130 CF1874E

显然有 DP,\(f_{i,j}\) 表示长度为 \(i\) 返回值为 \(j\) 的排列个数。\(j\)\(O(n^2)\) 级别的。所以直接转移是 \(O(n^6)\) 的。无法通过。

具体来说,转移式子是 \(f_{i,j} = \sum \limits_{1\leq x\leq i} \dbinom{i-1}{x-1} \sum \limits_{y+z=i-j} f_{x-1,y} \times f_{i-x,z}\)

考虑 \(f_{i,j}\) 的 OGF \(F_i(x) = \sum \limits_{j} f_{i,j}x^j\),则 \(F_i = x^i\sum \limits_{1 \leq y \leq i} \dbinom{i-1}{y-1} F_{y-1}F_{i-y}\)

由于 \(\deg F_n \leq \dfrac{n(n+1)}{2}\),直接带入 \(\dfrac{n(n+1)}{2}+1\) 个点值做拉格朗日插值反推系数即可。复杂度 \(O(n^4)\)

131 AGC043C

\(10^{18}\) 足够大,并且 \(i+j+k\) 相等的 \((i,j,k)\) 之间互不影响,所以容易得到多项式复杂度算法,按照 \(i+j+k\) 从大到小贪心即可。

将原图的边从小到大定向为 DAG,注意到 \((i,j,k)\) 会选当且仅当其后继都不选,\((i,j,k)\) 不选当且仅当其存在一个后继被选。这个结构和博弈完全相同。没有后继的点为必败点,则 \((i,j,k)\) 会选当且仅当其为必败点。

\((i,j,k)\) 每次只会移动一维,相当于三个游戏,所以考虑三个图上的 SG 函数,\((i,j,k)\) 必败当且仅当 \(a_i \oplus b_j \oplus c_k = 0\)

进一步,考虑 DAG 博弈的 SG 函数,是后继 SG 函数的 \(\mathrm{MEX}\)。所以 SG 最大值是 \(O(\sqrt m)\) 的。直接枚举 \(i,j\) 即可,复杂度 \(O(m)\)

132 炼石 NOIP R17T1

set 维护连续段会被卡常。

你倒着做并查集就能过了。复杂度还是 \(O(n \log n)\)

你可以用线性并查集和线性 RMQ 做到线性。

133 炼石 NOIP R17T2

根号分治直接做就行。

134 炼石 NOIP R17T3

考虑每个数的出现位置 \(l,r\) 可以看作一个区间,所以限制其实是在说,除了 \(i\) 对这个区间与最终区间有交但互不包含,其他区间和最终区间都是要么不交要么包含的。

放在平面上,相当于初始给若干矩形,每次查询一个矩形内被覆盖次数恰好为 \(1\) 的点的数量。

从左往右扫描线,维护最小值次小值,做一个历史版本和即可。一个方便理解历史版本和做法的方式是考虑线段树每个点有一个操作序列,每个是 \(+x\) 或者做一次累加历史和操作。你只需要记录这个队列中每次累加之前的加法和的最小值和次小值即可。

复杂度 \(O(n \log n)\)

135 炼石 NOIP R17T4

好难啊。

136 AGC058D

高妙的题。

ABC,BCA,CAB 共有的特征是下一个数为上一个数加 \(1\)

考虑对满足 \(a_{i+1}-a_i \equiv 1 \pmod 3\) 的极长连续段容斥。枚举 \(i\),钦定 \(i\) 个连续段。我们只关心连续段开头的三个字符,所以先把其他的 \(a-i,b-i,c-i\) 个 A,B,C 随意排列,然后插入 \(i\) 个 ABC,BCA 或 CAB。

由于我们钦定的是极长连续段开头,所以要求 ABC 前面不能是 C,BCA 前面不能是 A,CAB 前面不能是 B。

那就好做了。你发现对于每个位置,在后面能加的总是 ABC,BCA,CAB 三种之一,所以相当于每个空隙插任意多个总和为 \(i\),乘以 \(2^i\) 即可。不过你要分讨一下在开头插入,这种是没有限制的。

复杂度线性。

137 CF1097G

考虑用斯特林数降幂,\(x^k = \sum \limits_{i=0}^k \dbinom{x}{i}i!\begin{Bmatrix} k\\i\end{Bmatrix}\)

枚举 \(i\),则只需要计算 \(\sum \limits_{X} \dbinom{f(X)}{i}\),组合意义是所有点集的虚树上选 \(i\) 条边的方案数。

对此考虑 DP,一个选边对应的点集个数大概是所有最深被选边的 \(2^{sz} - 1\) 乘积,以及需要考虑选边的最浅点外面的部分,然后其他点可选可不选。

对此树形 DP,\(f_{i,j}\) 表示子树 \(i\) 选了 \(j\) 条边对应的答案。复杂度看似是 \(O(nk^2)\) 的,但只要 \(O(\min(sz_1,k)\times \min(sz_2,k))\) 合并子树复杂度就是 \(O(nk)\) 的。考虑这样一个事实,在合并两棵子树时,不妨看作子树 A 的 DFS 序后 \(k\) 个点与子树 B 的 DFS 序前 \(k\) 个点两两匹配,显然任意两个点最多只会在 LCA 处统计一次,其次会发现对于每个点 \(u\),会与之匹配的点的 DFS 序和 \(u\) 差是 \(O(k)\) 的,故总复杂度 \(O(nk)\)

138 CF1842G

考虑组合意义,\((a_i+kv)\) 可以看作每个点向后有 \(a_i\) 种,然后后缀加等价于在这个点放一个工具,之后可以用这个工具向后走,每次走可以有 \(v\) 种方案。然后 DP,\(f_{i,j}\) 表示前 \(i\) 个,用了 \(j\) 个不同工具即可。

139 CF1988F

考虑全局最大值位置 \(x\),则任意前缀最大值位置 \(y\leq x\),后缀最大值位置 \(y \geq x\)。所以可以枚举 \(x\),分为前后两部分。

现在相当于只需要考虑前缀最大值和上升数。记 \(f_{i,j,k}\) 表示长度为 \(i\) 的排列有 \(j\) 个前缀最大值和 \(k\) 个上升数的排列个数。考虑从大到小插入数,则新插入的数若想成为前缀最大值只能插在开头,而若插在后面,插在上升数之间上升数个数不变,否则上升数个数加 \(1\),现在我们已经可以 \(O(n^3)\) 解决这个 DP。

在中间时,需要合并两部分。枚举 \(y, z, u, v\) 表示之前的前缀最大值个数,上升个数,之后的前缀最大值个数,上升个数,贡献形如 \(f_{x,y,z}g_{n-x,u,v}a_yb_uc_{z+v}\)。直接做是 \(O(n^4)\),外层枚举 \(x\) 就是 \(O(n^5)\) 的了。但确定 \(z,v\)\(y,u\) 基本上就是独立的,不难做到 \(O(n^2)\),总复杂度 \(O(n^3)\)

140 CF1210F2

完美匹配考虑 Hall 定理。对于每个没有完美匹配的图 \(G\),考虑钦定一个代表元 \(S\),使得 \(|S|>|N(S)|\),我们选取 \(|S|-|N(S)|\) 最大的,在此基础上选取 \(|S|\) 最小的,我们声称其必定唯一,不难反证得到。

考虑 \(f_{S,T}\) 表示左侧点集 \(S\) 与右侧点集 \(T\) 有完美匹配的概率。我们选取两个集合 \(S',T'\),钦定 \(N(S')=T'\)\(S'\) 为代表元。考虑 \(S'\) 为代表元需要满足什么。首先 \(S',T'\) 内部不存在更优的代表元的可以通过变为子问题解决。其次要求 \(S \setminus S'\)\(T \setminus T'\) 有完美匹配,否则若存在一个 \(X \subseteq S \setminus S'\) 使得 \(|X|>|N(X)|\),那么令 \(Y=S' \cup X\) 即为一个比其优的代表元。我们声称这是充分必要的,原因是考虑若存在一个集合 \(X\) 使得 \(X \cap S' \neq \varnothing\)\(X \cap (S \setminus S') \neq \varnothing\)\(X\) 为更优的代表元,由于 \(S \setminus S'\)\(T \setminus T'\) 有完美匹配,取 \(X \cap S'\) 显然为更优的代表元。

故枚举 \(S',T'\) 后只要求 \(S \setminus S'\)\(T \setminus T'\) 有完美匹配,\(N(S')=T'\),且 \(S',T'\) 这部分中 \(S',T'\) 为代表元。为了处理后面的部分,记 \(g_{S,T}\) 表示 \(S,T\) 部分,\(S,T\) 是代表元的概率,转移与上述类似。

分析复杂度,枚举 \(S'\subseteq S\)\(T' \subseteq T\) 的复杂度都是 \(O(3^n)\),所以总复杂度 \(O(3^{2n})\)

141 AGC034F

考虑 \(f_i\) 表示答案,\(f_0=0\),对于 \(i \neq 0\),有 \(f_i = 1 + \sum \limits_{j} f_{i \oplus j}p_j\)\(p_j\) 为选 \(j\) 的概率。

也就是,\(f_i = 1+ \sum\limits_{x \oplus y=i} f_xp_y\)

\(\times\) 为集合幂级数的异或卷积,则 \(\forall i \neq 0, f_i = 1 + (f\times p)_i\)

所以 \(f \times p = (c,f_1-1,f_2-1,\cdots)\),只要能求出来 \(c\) 即可。

考虑到 \(\sum p = 1\),所以 \(\sum f_i = \sum (f\times p)_i\),故 \(c=f_0+2^n-1\)

考虑 \(p'_i = \begin{cases} p_i && i > 0 \\ p_0 - 1 && i = 0\end{cases}\)。则 \(f \times p' = (2^n-1,-1,-1,\cdots)\)。已知 \(p'\) 和结果故可以求出 \(f\)。而实际上 \(f\) 不一定有唯一解,求出来的不一定满足 \(f_0=0\),此时令每个数减去 \(f_0\) 即可。

142 P10435

首先两个序列 \(A,B\) 匹配肯定是从小到大依次匹配。

二分答案,考虑求出哪些环上区间可行。这不太好做,考虑对于每个 \(i\),其能匹配的 \(B\) 是一段区间 \([l_i,r_i]\),则要求环上区间中 \(\leq a_i\) 的数的个数在 \([l_i,r_i]\) 之间。不难注意到对于每个 \(i\) 其能匹配的是一段区间,不难分类讨论求出。复杂度 \(O(n \log V)\)

143 P10440

其实是有点难的。

思路很多,不要局限在某个特定思路中。有一些容易做到 \(3n\) 的做法,比如从 \(1\)\(n\) 依次确定每个点的所有邻居,但并不是很容易优化。

考虑将树以 \(1\) 为根,我们的目标是确定每个点的父亲。依次询问 \((1,i)\) 得到距离 \(1\)\(i\) 小的位置 \(u\),然后尝试寻找 \(u\) 的父亲。依次询问 \((u,1),(u,2),\cdots\),每次询问得到 \(x\) 后,考虑若 \(x\) 在某次询问 \((1,j)\),其中 \(j<i\) 中,成为过结果,那么 \(x\) 就是 \(u\) 的父亲,否则 \(u\)\(x\) 的父亲。

至此,除了询问 \((1,i)\),每次询问都至少得到了一个未确定父亲的点的父亲,询问次数不超过 \(2n\)

144 P10437

静态 Top Tree 板子题吧。

我还没写,加入 todo list。

145 P14311

\(b_x\) 一定是严格前缀最大值,\(b_z\) 一定是严格后缀最大值,证明显然。

故三者中至少有一个为全局最大值。若为 \(y\),容易计算答案。\(x,z\) 对称,不妨考虑 \(z\) 为全局最大值。

此时显然有 \(x\) 为严格前缀最大值,否则替换为之前的大于等于其的必定不劣。

我们声称只需要找到 \(O(\log V)\) 个最大的严格前缀最大值做为 \(x\) 计算即可。

原因是你考虑最优的是 \(x,y,z\),则 \(b_y\) 的限制就是 \(\leq \dfrac{b_x+b_z}{2}\)。此时考虑 \((y,z)\) 之间必然不存在大于等于 \(b_y\) 且小于等于 \(\dfrac{b_x+b_z}{2}\) 的数,所以 \((y,z)\) 之间的严格前缀最大值都大于 \(\dfrac{b_x+b_z}{2}\),且所有大于 \(\dfrac{b_x+b_z}{2}\) 必然单调递增,因为反之你可以选任意一个逆序对肯定不劣,而这些的任意两个肯定都不能和 \(z\) 做为三元组,故显然只有 \(O(\log V)\) 个严格前缀最大值。而 \(b_x\) 显然是 \([1,y)\) 之间的最大值,所以 \((x,y)\) 之间也不会有严格前缀最大值。

至此,不难利用一些数据结构在 \(O(n + q\log n\log V)\) 的复杂度内解决问题。

146 P14310

难以注意到,对称群 \(S_5\) 仅有 \(156\) 个子群。具体来说,搜出来所有子群,发现确实只有这么多。

对每种子群,只保留在群内的边,判定连通性即可。

147 P10439

不难发现本质就是个贪心,只要 \(l \rightarrow l+1\) 选的是哪个确定,后面的都可以直接贪心得到。

对称的,只要 \(r-1 \rightarrow r\) 选的是哪个确定,前面的也不难贪心得到。

直接枚举 \(l,r-1\) 中向下一个点的边数较小的一侧并记忆化,显然是 \(O(n\sqrt n)\) 的枚举次数。

加个倍增查询贪心的结果就是 \(O(n\sqrt n \log n)\) 的。

但是你既然都根号了,写个分块平衡复杂度就能做到 \(O(n \sqrt n)\) 了。

148 P14301

一个是非严格前缀最大值也是非严格后缀最大值的点只可能是全局最大值,故考虑把前缀最大值和后缀最大值分开维护,并对全局最大值特殊处理。

然后就好做了,维护每个点前缀 \(\max\) 减去其自身,每次把新的前后缀 \(\max\) 找出来,操作时特殊处理一下全局最大值即可。

149 炼石 NOIP R18T4 / P8996

先对序列进行一次操作。

我们把所有前缀最大值找出来,发现每个前缀最大值和下一个前缀最大值之间的段是在一起的,操作会在 \(\dfrac{n}{2}\) 的位置把这段分开,然后把后面多出来的这些段归并到整个序列里面。

不难通过线段树维护所有前缀最大值与段,复杂度 \(O(q \log n)\)

150 P14323

定义 \(S_i = \{i \oplus 1, i\oplus 2,\cdots, i \oplus n\}\)

我们的目标是对于每个 \(j\) 求出 \(p_i \oplus p_j\),同时我们也得到了 \(S_{p_i}\)

求出 \(S_{p_i}\) 后,对于每个 \(x \in [1,n]\) 验证 \(S_x = S_{p_i}\) 是否成立。暴力做是 \(O(n^2)\) 的。

注意到 \(S_x = \{y \mid 1 \leq y \oplus x \leq n\}\),枚举 \(y \oplus x\)\(n\) 在二进制下的 LCP,然后可以得到 \(y\) 的一个区间,判定集合相等时做 sum hash,于是预处理哈希前缀和就可以在 \(O(n \log n)\) 的复杂度内判定每个 \(S_x = S_{p_i}\) 是否成立。

不难证明 \(S_x = S_{p_i}\)\(x\) 至多只有两个,当且仅当 \(n=2^k-2\) 时有 \(S_x = S_{n + 1- x}\)

所以若 \(n \neq 2^k - 2\),求出 \(p_i\) 和所有 \(p_i \oplus p_j\) 后排列可以被唯一还原,否则 \(p_i = x\)\(p_i = n + 1 - x\),视为 \(p_i = x\) 后还原排列,用一次操作 \(2\) 即可确定 \(p_i = x\) 还是 \(p_i = n + 1 - x\)

现在目标是求出 \(S_{p_i}\)

假设我们已经找到了 \(x\) 使得 \(p_x - p_i > 2\),考虑对于所有 \(y \neq x\) 询问 \((x,y)\) 会得到什么。若 \(p_y > p_x\) 则得到 \(p_y \oplus p_i\)\(p_y < p_i\) 得到 \(p_y \oplus p_x\)\(p_i \leq p_y < p_x\) 时得到 \(p_i \oplus p_x\)。可以发现由于 \(p_x - p_i > 2\) 所以满足 \(p_i \leq p_y < p_x\)\(y\) 至少有 \(3\) 个。而 \(p_y > p_x\)\(p_y \oplus p_i\) 两两不同,\(p_y < p_i\)\(p_y \oplus p_x\) 互不相同,所以在所有结果中出现次数最大的即为 \(p_i \oplus p_x\),并且可以得到哪些 \(y\) 使得 \(p_y \in [p_i,p_x)\)

考虑对于所有 \(p_y \notin [p_i,p_x)\)\(y\) 确定 \(p_y > p_x\)\(p_y < p_i\) 哪个成立。任取一个 \(k\) 使得 \(p_k \in [p_i,p_x)\),分别询问 \((y,k)\)\((y,x)\),若 \(p_y > p_x\) 则两次返回值都是 \(p_y \oplus p_i\),否则分别是 \(p_y \oplus p_k\)\(p_y \oplus p_x\)。所以只需要判断两次结果是否相同即可判定 \(p_y>p_x\)\(p_y < p_i\) 哪个成立。

发现在判定每个 \(y\) 的过程中,若 \(p_y > p_x\) 则可以确定 \(p_y \oplus p_i\),否则可以确定 \(p_y \oplus p_x\),而 \(p_x \oplus p_i\) 也已确定,所以对于任意 \(p_y \notin [p_i,p_x)\) 都可以确定 \(p_y \oplus p_i\) 的值。

任取一个 \(z\) 使得 \(p_z < p_i\),若不存在则意味着 \(p_i = 1\),对于每个 \(p_y \in [p_i,p_x)\) 询问 \((z,y)\) 即可得到 \(p_y \oplus p_z\),又 \(p_z \oplus p_i\) 已知,所以可以确定 \(p_i \oplus p_y\) 的结果。这样我们得到了所有 \(p_i \oplus p_y\) 的结果,即得到了 \(S_{p_i}\)

但是还没完,第一步需要找到一个 \(x\) 使得 \(|p_x - p_i| > 2\) 还没有做到。由于 \(n\geq 7\),考虑随意选出七个不同的数 \(a_1,a_2,\cdots,a_7\),其中必然存在一个数使得 \(|p_x - p_i| > 2\),考虑两两询问一次,然后对于每个 \(i\) 判定所有 \((a_i,a_j)\) 返回值中相同的数的最大值是否至少为 \(3\) 即可找到一个符合条件的 \(x\)

分析询问次数,确定 \(x\) 的次数为 \(\dbinom{7}{2} = 21\) 次,然后对于每个 \(y \neq x\) 询问,次数是 \(n-1\),假设 \(p_y \in[p_i,p_x)\)\(y\)\(c\) 个,则询问次数为 \(n-c+c=n\),总次数粗略分析不超过 \(2n+20\),复杂度 \(O(n \log n)\),可以通过。

151 P14300

这个题不是很难。

首先确定了哪些位置要选后,贪心地应该从后往前每 \(w\) 个分一组一起运。即每 \(w\) 个算一次贡献。

对于原问题,直接 DP 是 \(f_{i,j,k}\) 表示 \(i\)\(n\),最后这组有 \(j\) 个,目前总距离为 \(k\) 的最大权值。复杂度 \(O(n^4)\)

注意到无论如何总距离不超过 \(\lceil \dfrac{n}{w} \rceil n\),故 \(k\) 上界就是这个,而 \(j\) 上界为 \(w\),状态数只有 \(O(n^3)\),总复杂度也是 \(O(n^3)\)

152 P12866

我们声称对于偶数 \(n\)\((x_1,y_1),\cdots,(x_n,y_n)\) 能中 \(k\) 次奖当且仅当以下条件同时满足:

  1. \(\forall 1 \leq i \leq n, x_i + y_i \geq k\)
  2. \(\sum \limits_{i=1}^n \min(k,x_i) \geq \dfrac{nk}{2}\)
  3. \(\sum \limits_{i=1}^n \min(k,y_i) \geq \dfrac{nk}{2}\)

必要性不难说明,充分性不难归纳说明。

主席树上二分即可。

153 P12429

神秘猜结论题,畏惧了。大概是每个点最终取值是相邻 \(O(1)\) 个数正负 \(O(1)\) 的值,然后 DP。

154 P12438

序列从最大值处断开,然后单侧递归线段树板子题吧。

155 NFLS 模拟赛 T3 / P11091

有点意思的题。

直接 DP 是记 \(f_{i,j}\) 表示考虑子树 \(i\) 内的叶子,最小值为 \(j\) 时,最大值最小是多少。

注意到若存在 \([x,f_{i,x}] \subseteq [y,f_{i,y}]\),则 \(y\) 没有意义,将此状态删去。我们声称只保留有用状态,且对于每个仅有一个儿子的点直接将状态继承,总状态数就是 \(O(n \log n)\) 的了。

为什么呢。考虑所有至少有两个儿子的点,并对原树按照子树内所有叶子对应集合大小做重链剖分。不难注意到对于每个 \(x\)\(x\)\(f_{i,x}\) 肯定是分属两个子树内的答案。\(x\) 在轻子树内,状态数只有轻子树大小这么多。当 \(x\) 在重子树时,\(f_{i,x}\) 在轻子树,此时只有轻子树大小这么多个 \(f_{i,x}\),故有效状态也只有这么多。每个点的状态数不超过轻儿子大小两倍,总状态数 \(O(n \log n)\)

对于 DP 部分,做 \(O(n2^kk^2\log n)\) 的状压 DP 即可。但有 \(k\) 个儿子的点只有 \(O(\dfrac{n}{k})\) 个,这样分析得到的应该是 \(O(n2^kk\log n)\)。完全跑不满,可以通过。

156 P12426

不难求出最靠左和最靠右的 B,假设分别在 \(x\)\(y\)。对于每个 \(i \in (x,y)\) 依次判定 \(i\) 上的字符是不是 B。

由于是顺次判定,在过程中我们已经得到 \([x,i)\)\([i,y]\) 中 B 的出现次数,不难通过分类讨论 \([x,i)\)\((i,y]\) 中 B 是不是众数以进行判定。

157 P12577

将 LCA 断开拆成祖先链。

一个点 \(x\) 爆了当且仅当 \(x\) 的颜色与给定颜色不同,且 \(t_x \leq dis_u-dis_x+T\)\(dis\) 是到根链长度。不同颜色的最小值这个结构是经典问题,记录最小值与对应颜色,以及与最小值颜色不同的次小值即可。树剖容易做到 \(O(n \log^2 n)\)

158 P12581

这个结构比较显然是画在平面上,然后对轮廓线做 DP 就行了,线段树优化即可。

159 P12038

考虑折半搜索,类似边分治你如果能找到一条边尽量划分均匀那就赢了。

正常做边分治你要三度化,三度化上连通块信息无法得以直接保留,不过我们考虑边分治在点分治上的体现。

选出重心,根据经典结论,此事在 P11988 亦有记载,肯定能对重心的子树排序后依次选取使得选取的部分在 \([\dfrac{n}{3},\dfrac{2n}{3}]\) 之间,这样做折半搜索就是 \(O(2^{\frac{2n}{3}}n)\) 了,看起来你可以把 \(n\) 干掉,因为连通信息是可以考虑点边容斥的,这样复杂度看起来就更对了。

160 P12357

对于每个点先不考虑选其父亲,我们自信地认为选父亲不难通过一些换根做出来。

只选子树那就简单了,由于你要选两个子树,所以必然有一个不是重子树,那你直接对轻子树暴力做就行了。

posted @ 2025-10-01 08:41  HappyBobb  阅读(78)  评论(1)    收藏  举报