暑假训练记录(二)

Countings

CF2071E

考虑一个点 \(u\) 成为叶子的条件:其本身未被删除,邻居删除到最多一个。设 \(f_u=\prod_{(u,v)\in E}w_v,g_u=\sum_{(v,u)\in E}\frac{1}{w_v}\),根据乘法原理有:

\[(1-w_u)f_u(1+g_u) \]

考虑统计点对。一个点的二阶以上邻域互相贡献满足乘法原理,可以算出来所有的乘积再除掉二阶以内邻域的乘积。

一阶邻域可以暴力遍历,复杂度不会错。二阶邻域的乘积可以在先对每个点处理一阶邻域的乘积,再对每个点单步容斥算出来二阶邻域的乘积。

现在问题是二阶邻域互相贡献怎么算,问题在于中间那个点。设这三个点排起来分别是 \((u,p,v)\),则贡献为:

\[(1-w_u)(1-w_v)\frac{f_uf_v}{w_p}(1+(g_u-w_p)(g_v-w_p)+\frac{1-w_p}{w_p}) \]

把贡献全部拆开来可以枚举 \(p\) 然后维护。

CF1919E ARC146E

BEST 定理是沙棘吧。。。

这个题就是叫你求有多少哈密顿路径。直接对着路径搞 DP 肯定没前途,考虑对着值域 DP。

考虑设状态,我们只关心哈密顿路径在当前值的断点状态。可以设 \(f_{i,j,0/1/2}\) 表示有 \(j\) 个断点,和有多少个起点/终点在之前。转移可以分讨,系数是一个插板法。

重点在于,\(j\) 只能转移到 \(2a_{i+1}-j\),于是直接做就可以 \(O(n^2)\)

咋做 \(O(n)\) 呢?DP 打出来表发现有值的位置很少。只把有值的地方拿出来 DP,发现过了。为啥呢?

考虑 \(f_{1,j}\) 哪里有值,发现只有 \(O(1)\) 个地方有值,而我们转移 \(j\) 也是确定的,所以后面也只有 \(O(1)\) 个地方有值。

于是使用哈希表可以做到 \(O(n)\)

思考:换维。

CF1895F

看到这个限制,就是说 \(\min\leq (x+k-1),x\leq \max\)

先别急着全部容斥,先容斥一部分。

就是容斥变成 \(\min\leq x+k-1\) 的方案数减去 \(\max\leq x\) 的方案数。后者显然是线性递推。

前者。考虑一个双射,一个数组与这个数组的差分数组和任意一个确定的值构成双射。

也就是确定差分数组和这个序列的 \(\min\) 之后就确定了整个数组。于是前者方案数是 \((x+k)(2k+1)^{n-1}\)

思考:序列的双射,容斥一部分。

CF1821F

看到这个东西,先想一想,是不是直接对着被覆盖的状态做就行啊?

然而是不行的,因为可能会算重。

我们认真考虑一下怎么判定一个种树方案是否合法。很容易想到贪心:从左往右看每棵树,如果一棵树能往左倒就往左,否则就往右。

那直接对着这个判定 DP 也不太行。回到之前的想法,对着覆盖的状态 DP。

考察一个覆盖的状态对应了多少种树的方案。设这个覆盖方案的 \(m\) 个区间与上一个区间的距离序列为 \(a\)\(0\) 位置也视为被覆盖),则符合判定的种树方案有 \(2^x\) 种,其中 \(x=\sum_{i=1}^n[a_i\leq k]\)。因为如果间隔 \(>k\),那么这棵树就只能放在这个区间的右端点,否则放在左端点会使它向左倒。

此时上一个 DP 来统计显然是不行的。因为贡献跟 \(x\) 有关,所以考虑二项式反演。

二项式反演,如果反演成钦定 \(x\)\(a_i\leq k\),是一个有上界的不定方程解计数,而我们能直接做的是有下界的计数,所以反演成钦定 \(x\)\(a_i>k\) 比较好做。此时方案数为:

\[\binom{m}{x}\binom{n-xk-m(k+1)+m}{m} \]

那么根据二项式反演,答案为:

\[\begin{aligned} &\quad\sum_{i=0}^m2^{m-i}\sum_{j=i}^m(-1)^{j-i}\binom{j}{i}\binom{m}{j}\binom{n-jk-m(k+1)+n}{m}\\ &=2^m\sum_{j=0}^m(-1)^j\binom{m}{j}\binom{n-jk-m(k+1)+n}{m}\sum_{i=0}^j(-\frac{1}{2})^{i}\binom{j}{i}\\ &=\sum_{j=0}^m(-1)^j\binom{m}{j}\binom{n-jk-m(k+1)+n}{m}2^{m-i}\\ \end{aligned} \]

可以 \(O(n)\) 计算。

CF1815D

考察一个异或和 \(x\) 合法的条件。先拆位。发现除了 \(x\) 要有的位,其他位都得是偶数个,而且每一位的个数的最大值不能超过 \(m\)

一个重要发现是,给定 \(n\),我们可以用两个数构造出来满足和为 \(n\) 异或和为 \(0\)。于是 \(m\geq 3\) 是来送的。\(m=1\) 本来也是来送的,现在只要考虑 \(m=2\)。发现直接 DP 一下就好了。

CF2134F

考察这个运算表的性质,发现 \(\{0,2\}\)\(\{1,3\}\) 之间运算答案一定是 \(1\),且内部运算只可能是 \(0\)\(2\)。所以可以分别考虑这两个集合。设 \(f_{i,j}\)\(\{0\cdot c_0,2\cdot c_2\}\) 组成的序列,分成 \(i\) 段,贡献为 \(2j\) 的方案数。\(g_{i,j}\)\(\{1\cdot c_1,3\cdot c_3\}\) 的方案数。可以由这两个数组 \(O(n^3)\) 合并出答案。

现在考虑如何计算这个数组。发现可以插板法简单 \(O(n^3)\) 计算。

ARC162E

对着序列和值域 DP 都不太行。考虑对着限制从紧到松 DP。

考察限制。设 \(i\) 这个数出现的位置集合为 \(S_i\),那么要满足 \(|S_i|\leq A_i,|S_i|\leq \min_{x\in S}\{A_x\}\)

注意如果按 \(|S|\) 从大到小 DP,可以发现限制只会变松,也就是之前能填的方案不会变的不能填。

所以可以设计一个 DP,\(f_{i,j,k}\) 表示填了 \(|S|\geq i\) 的颜色,填了 \(j\) 种颜色,填了 \(k\) 个位置,容易转移,系数可以用组合数简单描述。注意这样转移复杂度看起来是 \(O(n^4)\) 的,但是 \(j\) 这一维的大小和转移枚举填了多少个数是 \(O(\frac{n}{i})\) 的,那么复杂度就是:

\[\begin{aligned} &\quad\sum_{i=1}^n\sum_{k=1}^n\sum_{j=1}^{\frac{n}{i}}\frac{n}{i}\\ &=n^3\sum_{i=1}^n\frac{1}{i^2}\\ &=O(n^3) \end{aligned} \]

ARC157E

注意 Y 是独立集。一共有 \(B\) 个 Y,有 \(B-\frac{C}{2}\)\(Y\) 在叶子上,这一部分的 XY 和 XX 贡献是确定的。剩下就是只有 \(A,B\) 限制了,直接树形 DP。

ARC165E

期望肯定拆贡献。把贡献拆到每一个操作点上,就是要算这个点被操作的概率。枚举这个点被操作时所在的连通块,那么就是要算这个操作到这个连通块的概率。

设这个连通块大小为 \(x\),其相邻且不在连通块内的点数为 \(y\),那么就是要 \(x>k\),求这 \(y\) 个点在这 \(x\) 个点之前操作的概率。

先对这个题的操作进行一个转化,就是随机一个排列 \(p\),依次考虑排列里的每一个元素,若其所在连通块大小 \(>k\) 就操作他否则啥也不干。容易发现这样是等价的,那么上面所说的概率就是 \(\frac{(x+y)!}{x!y!}\)。现在转为统计这样的和。可以树形背包简单 \(O(n^2k^2)\) 统计。

ARC163D

首先转化,拆贡献。大家都知道竞赛图缩点之后是一条链,那么我们把贡献拆到每条边上,就是求有多少种划分为集合 \(A,B\) 的方式满足 \(A,B\) 之间的所有边都是 \(A\) 指向 \(B\) 的,其中 \(A\) 可以为空集。

搞到这个就可以直接 DP 了。设 \(f_{i,j,k}\) 为加入了编号为 \(1\sim i+j\) 的点,\(|A|=i,|B|=j\),有 \(k\) 条从小到大的边的方案数即可。

模拟赛记录

8.18

T1

T2

T3 CF878D

本题最难的一步:注意到 \(k\times n\) 的 01 矩阵只有 \(2^k\) 个本质不同的列。

直接 bitset 维护,\(O(\frac{n2^k}{w})\)

T4

首先树拓扑序数量公式 \(\frac{n}{\prod_u siz_u}\)

考虑贡献提前确定,设 \(f_{u,i}\) 表示考虑 \(u\) 子树之外的点且在拓扑序中 \(u\) 位置为 \(i\) 的拓扑序个数。可以做到 \(O(n^2)\) 简单转移。

8.21

T1

暴力。你再不济枚举一对点跑最小割都行,而且因为这是平面图还可以转成最短路。

T2

模板矩形面积并。

T3

基环树上随便做一做。

T4

先用 Lucas。容斥一下变成数位 DP。

正睿 1

T1

T2

错解不优,之后可以从大到小枚举每条边做。\(O(n^3+nm)\)

T3

\(n\) 个人,第 \(i\) 个人的分数是 \([L_i,R_i]\) 内均匀随机的实数。对每个人求出其排名为 \(i\) 的概率。\(n\leq 114\)

先离散化。考虑先枚举一个人,把这个人的答案算出来。

那就枚举一个人,再枚举这个人所在的离散化区间,然后设一个背包 \(f_{i,j,k}\) 表示考虑前 \(i\) 个人,有 \(j\) 个人的区间在这个区间前面,\(k\) 个和他同一个区间。可以做到 \(O(n^5)\)

考虑优化。发现先枚举离散化区间之后,相当于一个缺一背包,直接线段树分治可以做到 \(O(n^4\log n)\)

考虑优化。发现背包顺序不影响答案,于是可以考虑先算出来所有的再撤销一个。注意分讨。可以做到 \(O(n^4)\)

T4

给定一棵树,树有点权,定义点集 \(sub(u,k)\)\(u\) 子树内距离 \(u\) 不超过 \(k\) 的点的数量。有三种操作,加叶子、对 \(sub(u,k)\) 加上一个数、查询 \(sub(u,k)\) 的和。\(n\leq 4\times 10^5,q\leq 5\times 10^4\)

变成 KDT 加点矩形加矩形和。

代码源 2

T1

随便树形 DP 一下。

T2

给定 \(n\) 对数 \(a_i,b_i\),对每个 \(m\) 求出有多少对数满足 \(a_i\bmod m<b_i\bmod m\)

考察 \((a+b)\bmod m<a\bmod m\) 的条件,发现是 \(a\bmod m+b\bmod m\geq m\),进而可以发现是 \(\lfloor\frac{a}{m}\rfloor+\lfloor\frac{b}{m}\rfloor=\lfloor\frac{a+b}{m}\rfloor+1\)。最终可以发现 \([(a+b)\bmod m<a\bmod m]=\lfloor\frac{a}{m}\rfloor+\lfloor\frac{b}{m}\rfloor-\lfloor\frac{a+b}{m}\rfloor\)

进行换元,可以得到 \([a\bmod m<b\bmod m]\) 的拆贡献表达式,可以 \(O(n\log n)\) 统计。

思考:???

T3 Q10780

注意条件 \(\sum_i a_i\leq 5\times 10^5\)。所以可以设计一个 DP,\(f_i\) 表示 \(a\) 的前缀和等于 \(i\) 的最小价值。可以单调队列做到 \(O(n\sum_i a_i)\)

但是这样会被卡常。你设 \(f_{i,j}\) 表示前 \(i\) 天,第 \(i\) 天用 \(j\) 的最小价值。这样复杂度还是 \(O(n\sum_i a_i)\),但是单调队列上的复杂度是 \(O(nm)\)。唐。

思考:思考。

T4 Q13559

要维护的是每个连通块有哪些相邻连通块。

首先是只会进行 \(O(RC)\) 次合并,用启发式合并维护,合并这一部分的复杂度是 \(O(RC\log RC)\)

现在问题是如何快速找出同色相邻连通块,直接对度数根号分治即可。

9.6

T4 P4332

注意如果把 \(0\) 翻转成 \(1\),只会导致 \(0\) 上方一段连续的 \(0\) 变成 \(1\)。于是树剖即可。

正睿 2

T3

官方题解说的什么几把。。?

\(a_{i,j}\)\(i\) 进行 \(j\) 次操作后的值,不难发现 \(a_{i,j}=(i-j)\times 2^j\)

那第一问就是要我们求出一个 \(h\) 使得这个矩阵前 \(h\) 行有至少 \(n\) 个不同的数。考虑一个不同的数该如何被唯一的生成,发现若 \((i-j)\) 为偶数,则 \((i-j)\times 2^j=(\frac{i-j}{2})\times 2^{j+1}\),所以新的数一定有 \((i-j)\) 为奇数,进而一行有 \(\lceil\frac{i}{2}\rceil\) 个新的数。根据这个可以二分求出 \(h\) 并求出第一问的答案。

考虑第二问。先解决字典序最小这个问题,发现前 \(h-1\) 行的数必须都选满,只有第 \(h\) 行可能空着。令第 \(h\) 行选最大的那几个新的数就行了。然后考虑对着操作后的序列做,发现一定是先选第一列的值,然后选第二列的新的值,以此类推,所以可以二分把这个值求出来,进而可以求出原值。

T4

给定 \(T,n,m,A,B,C\),有一个初始为 \(n\) 个孤立点的图,你要进行 \(m\) 次操作,每次选中 \(1\leq u\leq v\leq n\),添加 \((u,v)\) 这条边。设 \(f\) 为这张图的割边个数,若 \(f\) 增加则权值 \(+A\),不变则 \(+B\),变少则加 \(+C\)。如果 \(T=1\),你要求出所有操作之后图是一个边双的权值和,如果 \(T=2\),你要求出所有权值和。\(n,m\leq 50\)

注意总会有恰好 \(n-1\) 次割边数量增多,于是我们可以令 \(C=0\),这样也可以算出答案。

考虑倒序操作,加边变成删边。考虑做 \(T=1\),设 \(f_{i,j}\)\(i\) 个点 \(m\) 条边的答案,\(f^{'}_{i,j}\) 为方案数,删边之后如果还是双连通图,如果删的这条边不是割边,可以从 \(f_{i,j-1}\) 转移过来;如果这条边是割边,那么剩下的图形如一些双连通图串起来,搞一个辅助背包 DP 即可。

考虑做 \(T=2\)。考虑最终图一定是一些连通块,块之间独立。每个块内缩点之后是一棵树,可以枚举 \(1\) 号点所在的分量进行背包处理。

正睿 3

我还是太菜了。

T2

给定一个长为 \(2n\) 值域为 \([0,n]\) 的序列,问能否选出一个子区间,使得这个子区间可以被划分为两个集合,使得这两个集合的和相等。报告无解或给出构造。\(n\leq 10^6\)

构造题,考虑抽屉原理啊。

要给这个问题构造出鸽笼原理,考虑给这个序列的每个数赋上一个 \(\pm 1\) 的权值,然后做前缀和。如果前缀和出现相等的值说明有解,直接输出答案。

考虑把取值限制在 \((-n,n]\) 中,这样我们有 \(2n+1\) 个数,一定会出现相同的。而这样也很好办,只需要维护当前前缀和,加入一个数的时候选一个让其绝对值最小的方法加进去就行。

T3

给定平面上 \(n\) 个点,\(q\) 次询问给出 \(i,k\),问距离(切比雪夫距离)点 \(i\)\(k\) 小的点的距离和。

\(n,q\leq 5\times 10^5,\sum k\leq 10^6\)

关键在于 \(\sum k\leq 10^6\)。否则我们几乎只能二分二维数点然后拆贡献维护。

这样考虑切比雪夫距离转曼哈顿距离,考虑把曼哈顿距离的四个方向拆开,每个方向各找 \(k\) 个点,最后归并起来。

怎么找点?考虑扫描线。考虑左下方向,其余类似。扫描线从下往上扫,线段树每个节点维护一个堆,这样可以得到 \(O(n\log^2n+k\log n)\)。可以通过。

正睿 4

T3

给定数轴上 \(n\) 条线段,你需要对 \(k=1\sim n\) 求出最大答案:将 \(n\) 个线段分为 \(k\) 组,方案的价值定义为每组的交的长度之和。

\(n\leq 6\times 10^3\)

首先注意到若一个区间包含了另外一个区间,那么大区间要么跟小区间分到一组,要么单独一组。

于是可以把大小区间分别拎出来,小区间 \(O(n^2)\) DP 出来答案,跟大区间合并起来即可。

T4

给定长为 \(n\) 的数列,定义一个区间的价值为其 LIS 长度。对 \(k=1\sim n\) 求出,将序列分为 \(k\) 个区间,最大的价值之和。

\(n\leq 1.5\times 10^5\)

首先注意到区间 LIS 长度满足四边形不等式,于是可以做到 \(O(n\log n)\) 做一个 \(k\) 的答案。

然后注意到区间的价值是 \(O(len)\) 级别的,那么我们可以套用那个 trick 做到 \(O(n\sqrt n\log n)\) 求出所有的答案。

具体地,对于 \(k\leq \sqrt n\) 直接暴力 DP。对于 \(k>\sqrt n\),用 wqs 二分,容易发现二分的斜率是 \(\leq \frac{n}{k}\) 的,可以对每个斜率预处理 DP。

代码源 1

T2

给你 \(n,m\) 和一个长为 \(n\) 的排列 \(q\),有一个排列 \(p\),初始时为 \(p_i=i\)。你可以做 \(m\) 次操作:选定一个 \(x\),将 \(p\)\(1\sim x\) 循环左移一位。问有多少种操作序列能让 \(p\) 变为 \(q\)

\(n\leq 10^6\)

考虑倒序操作,变成把 \(x\) 位置的这个数提到序列最前面。

若我们确定了一个操作序列,依次进行操作,那最终得到的序列是把操作过的数拎出来重新按顺序放到前面,剩下的相对顺序不变。

这个条件很关键。设 \(f_{i,j}\) 表示操作 \(i\) 步,已经确定 \(j\) 个数的相对顺序已被排序。可以转移:

\[f_{i,j}=jf_{i-1,j}+f_{i-1,j-1} \]

其中第一个转移是在序列的开头新增 \(j\) 种操作,第二个转移是在末尾新增这一种操作。不难发现这就是第二类斯特林数。

那如果从组合意义考虑呢,我们把 \(\{1,2,3,\cdots,n\}\) 分成 \(m\) 个子集,此时我们希望这个方案跟操作序列形成一个双射。我们只要把这 \(m\) 个集合按照最小元素排序,然后挨个标上操作的位置即可。

注意有一种情况就是只操作值域 \([1,k]\),然后剩下值域 \([k+1,n]\) 的元素顺序原本就已经被确定。所以最后的答案是第二类斯特林数第 \(n\) 行的一个后缀和。

考虑咋算呢,注意第二类斯特林数是一个卷积形式,而卷积式的前缀和是好求的,就是对应前缀和乘起来,那么我们就做完了。

T3 Q13024

首先前缀和然后把操作按前缀和表示,不难发现最后一定是形如 0000...0123456... 的序列。考虑合并,直接线段树维护即可。

T4 Q13308

两条线段相交当且仅当是逆序对。那么原题等价于选一个权值最小的极长上升子序列。转移:

\[f_i=\min_{j}\{f_j\}+v_i \]

条件:

\[p_j<p_i,\forall i<k<j,p_k\notin [p_i,p_j] \]

看到偏序问题,考虑分治解决。具体地选择当前区间中点,递归先计算出左边的 DP 值,然后处理跨过中点的转移。

转移时预处理每个左边点右边比它大的最小值,设为 \(l_i\),右边点左边比他小的最大值 \(r_i\),则转移条件变为:

\[r_i\leq p_j\leq p_i\leq l_j \]

是一个 3-side 矩形二维数点,可以直接计算。

代码源 3

AGC 板刷记录

001D

不难想到图论建模。给相同的连上边,那么目标就是使整张图连通。

我们知道最少用 \(n-1\) 条边才能使图连通,而每个序列最多只能连上 \(\lfloor\frac{n}{2}\rfloor\) 条边,所以这个图要么是一条链要么是一个环。

既然这样,那最多有两个叶子节点。而如果存在一个长度为奇数的回文区间,那么中间那个点一定是一个叶子结点,所以一共有不超过 \(2\) 个奇数区间。

然后分讨。每种情况把这些区间挨个串起来即可。

001E

不难想到组合意义转化。然后发现组合数递推是一个线性递推,于是可以把所有递推初始值放到一块做。

思考:贡献的合并。

这里介绍一个生成函数大力解法,设 \(t_i=a_i+b_i\)

\[\begin{aligned} &\quad\sum_{i=1}^n\sum_{j=1}^n\binom{t_i+t_j}{a_i+a_j}\\ &=\sum_{i=1}^n\sum_{j=1}^n[z^{a_i+a_j}](1+z)^{t_i+t_j}\\ &=[z^0]\sum_{i=1}^n\sum_{j=1}^nz^{-a_i-a_j}(1+z)^{t_i+t_j}\\ &=[z^0](\sum_{i=1}^nz^{-a_i}(1+z)^{t_i})^2\\ &=[z^0](\sum_{i=1}^{2m}(1+z)^i\sum_{j,t_j=i}z^{-a_j}) \end{aligned} \]

直接秦九韶算法暴力卷积即可。

001F

考察这个排列的逆,那么操作变为选取一对相邻的元素满足差值至少为 \(k\) 然后交换。目标变为让 \(1,2,\cdots,n\) 依次尽量靠左。

考察这个操作,尝试找出其中的不变量。发现值域 \([t,t+k-1)\) 的区间内的元素的相对顺序不会改变。猜测这是所有能达到的数列的充要条件,发现对了。

考察这个目标,发现连出 DAG 之后就是制作菜肴,要求其 DAG 反图的拓扑序的字典序最大。

考虑怎么建出图,set 随便维护一下前驱后继就行了。

002D

模板 Kruskal 重构树。

002E

这个刻画有点厉害。

首先把这个序列从大到小排序,变成一个 Ferrers 图。然后操作是可以删掉最下面的一行或者最左边的一列,再转化,变成网格图可以往右往上走,走到边界就输了。

然后考虑,一个状态必胜当且仅当后继状态中存在一个必败,必败当且仅当后继状态中全为必胜。边界上全为必败,然后可以根据这个 DP 出原点的状态,但是复杂度爆炸。

找找规律就行了。

002F

发现可以直接把序列维扔掉。

003D

考虑分解质因数,然后简单做。

咋分解质因数。根号分治把 \(^3\sqrt{10^{10}}\) 以下的除掉,剩下的判是不是完全平方数。

003E

随便递归一下。

003F

随便分讨一下矩乘一下。

004C

随便构造一下。

004D

基环树上随便贪心一下。

004E

可以转化一下视角,让机器人带着边框动。

一开始我想的是直接枚举一个矩形判断这个矩形能不能全部被选,但是这样是错的。因为最终选出来的不一定是一个矩形。

所以我们可以考虑 DP,设 \(f_{l,r,u,d}\) 为走的步数,可以简单转移。

004F

td

005D

肯定考虑容斥。直接钦定有 \(x\)\(i\) 满足 \(a_i=i\pm k\),系数是 \((-1)^x\),记得还要乘上外面的方案数 \((n-x)!\)

考虑怎么算钦定的方案数。发现只有 \(\bmod k\) 同余的 \(i\) 会相互影响,那么可以把这个东西拆成 \(\frac{n}{k}\) 个链,每个链 DP 一下算出来方案数(好像有封闭形式)再合并起来,这样复杂度是 \(O(\frac{n}{k}\times n\times k)\) 的。

把合并那一步换成卷积可以做到 \(O(n\log n)\)

005E

显然游戏不会结束当且仅当存在一条红边,连接其两个端点的蓝边链长度 \(\geq 3\),而且红方能够先于蓝方赶往这个地方。可以简单枚举判断。

于是剩下的情况就是游戏一定会结束。考虑红方一定是逃往一个点之后等着被抓,蓝方一定不会停一手,那么答案就是蓝方追击到红方的步数 \(\times 2\)。DFS 枚举一下红方逃往哪个点计算答案即可,注意判断红方有可能在途中被截获。

005F

考虑每个点对 \(f(k)\) 的贡献,容易得到:

\[f(k)=n\binom{n}{k}-(\sum_{u\neq 1}(\binom{siz_u}{k}+\binom{n-siz_u}{k})) \]

看起来非常不可做的样子,原因是 \(siz_u\) 这个东西像一坨史一样糊在了这个二项式系数里。不妨处理出 \(cnt_i\) 表示 \(siz_u=i\)\(u\) 的个数:

\[f(k)=n\binom{n}{k}-(\sum_{i=1}^{n}cnt_i(\binom{i}{k}+\binom{n-i}{k})) \]

只考虑 \(\sum_{i=1}^ncnt_i\binom{i}{k}\) 怎么算,后面一项是对称的。

\[\begin{aligned} &\quad\sum_{i=1}^ncnt_i\binom{i}{k}\\ &=\sum_{i=1}^ncnt_i\frac{i!}{k!(i-k)!}\\ &=\frac{1}{k!}\sum_{i=1}^n(cnt_ii!)\frac{1}{(i-k)!} \end{aligned} \]

是一个差卷积形式。NTT 直接做即可。

006C

稍微推一下式子可以得出操作 \(a_j\) 相当于 \(x_{a_j}\leftarrow x_{a_j-1}+x_{a_j+1}-x_{a_j}\)

差分之后变成 \(d_i\leftarrow d_{i+1}\)

然后可以发现每一轮操作是一个线性变换,而且这个线性变换是一个赋值类型的变换,可以做到 \(O(n)\) 合并。于是直接快速幂即可。

006D

直接二分变成 01 序列,发现如果有两个相同的数挨在一块就会一直向上传递,这样只需要考虑最中间是 01 交错的情况。发现可以简单判断,于是可以 \(O(n\log n)\) 解决。优化到线性也是简单的。

022F

可以发现最后剩下的点的坐标形如:

\[\sum_{i=1}^nX^i(-1)^{a_i}2^{b_i} \]

因为 \(X\) 十分巨大,所以后面的系数不会互相影响,所以等价于计算有多少种不同的后面的系数能被生成。

注意这个对称的过程有点像把两个数合并起来,所以考察这个合并的结构,是一棵二叉树,我们令对称中心的那个点为左儿子。

一个叶子结点 \(X^i\) 对根节点的贡献系数,\(a_i\) 是其作为右子树的次数奇偶性,\(b_i\) 是其作为左子树的次数。

考虑枚举一个数组 \(c_{x,y}\) 表示有 \(c_{x,y}\) 个叶子的 \(a=x,b=y\),其中 \(x\in \{0,1\},0\leq y\leq n\)。考虑判定这个数组能不能组成一棵合法的树,每次操作形如把 \((1-x,y)\)\((x,y+1)\) 变成 \((x,y)\),可以贪心 \(y\) 从大到小消除。如果合法,就贡献了一个多重集排列数的方案数。

考虑 DP 记录这个过程,即可通过。

杂题

ARC205E

像这种子集求和形式的转移可以直接根号分治。

CF516D

求出直径长度 \(l\) 和中点 \(m\),注意到 \(\max_i \operatorname{dis}(x,i)=\frac{l}{2}+\operatorname{dis}(x,m)\)

于是可以直接对每次询问双指针。

CF516E

首先求出 \(d=\gcd(n,m)\),发现只有模 \(d\) 同余的人才会互相影响。

考虑对每组分别求出男女的时间。考虑图论建模。然后可以连出一个环,还有源点到 \(O(n)\) 个点的边。exgcd 把环搞出来就行了。\(O(n\log n)\)

ARC130F

显然能变小就操作是不劣的。而且最终序列是下凸的。

那么考虑我们是怎么建凸壳的,直接从左到右挨个增量考虑。这个题也仿照一下,就做完了。

ARC135F

nd,诗人我吃。

Q14015

Analysis will be added a bit later.

PJ NOIP5 T2 | Q14036

\(f_{i,j}\) 为血量为 \((i,j)\) 的期望步数。显然直接 DP 不行,有环。考虑先写出转移式:

\[f_{i,j}=\min\{f_{n,m},pf_{i,j-1}+(1-p)f_{i-1,j}+1\} \]

回想我们以前做转移带环的 DP 是怎么做的。要么高斯消元(适用线性方程组),要么最短路优化(适用一类可建模成图的最优化问题)。那这个题都不符合,咋办呢。考虑设一个数为未知元,不妨设 \(f_{n,m}=x\),那么每个 DP 的取值可以描述成一些一次函数的 \(\min\),就是一个上凸壳。可以直接把这个上凸壳 DP 出来,然后解方程 \(x=f_{n,m}(x)\),最大的 \(x\) 就是答案(因为 \(f_{n,m}\) 没有到自己的转移)。

考虑优化。因为 \(f_{i,j}\) 的上凸壳一定是以斜率为 \(1\) 的一段开始,所以最大的 \(x=f_{n,m}(x)\) 满足可二分性。所以可以二分。

P13691

发现从一个点开始往后走花费最多为 \(k\) 所能到达的地方是一个区间,考虑倍增转移。注意代价有 \(1,2\),所以要维护步数 \(2^j,2^j-1\) 的倍增。转移的时候注意到一定是在当前能到的区间里 \(a,b\) 最大的区间往后跳,于是可以做到 \(O(n\log n)\)

ARC164E

首先离散化,最大深度是好求的,容易构造出来。

考虑刻画一个线段树合法的条件,就是第 \(d-1\) 层有至多 \(2^{d-1}\) 个点,于是可以对着这个 DP,设 \(f_{i,j}\) 为第 \(d\)\(i\) 个点,\(d-1\)\(j\) 个点的答案,即可。

GYM103409H

先对模式串建 AC 自动机。考察 \(w(l,r)\) 是啥东西。把这个东西放到 01 Trie 上,是 \(O(\log V)\) 个子树,现在我们要维护 AC 自动机上走 01 Trie 的一个子树的值能匹配多少,发现倍增是容易合并的。直接做即可。

P6326

注意一定买一个连通块,所以可以点分治然后根必须选。

考虑求值,发现是一个背包,直接做可以获得 \(O(nm^2\log n)\) 的好成绩。

复杂度瓶颈在于合并背包是很慢的,于是考虑加入物品。按照 DFS 序考虑,如果这个点不选就直接转移出这个点的子树,否则转移到下一个点,可以获得 \(O(nm\log n)\) 的好成绩。

CF566C

表达式为 \(\sum_{i=1}^n\operatorname{dis}(x,i)^{\frac{3}{2}}\)。注意 \(x^{\frac{3}{2}}\) 这个函数是凸的,所以这些加起来也是凸的。所以我们有一个初步做法,先随便定一个点,然后算出其所有相邻点的答案,选一个最小的走过去。这个过程可以点分治优化,但是会被菊花图卡成 \(O(n^2)\)

考虑优化,考虑求导,选一个导数为负的走过去,这样就可以了。

CF715C

因为 \(10\) 的逆元存在,所以可以点分治正反做两遍求出答案。

DSU on tree 的话,考虑维护一个乘法加法 tag,也可以直接做。

P7560

扫描线扫序列维,线段树上维护每一个时刻的信息。维护一个前缀 \(\min\),容易发现这就是最后一次被清空为 \(0\) 的时刻。然后线段树上二分找到加人所在的时间即可。

P8518

仿照 P7560 的做法,找到最后触碰到边界的时刻。先做一个前缀和,容易发现 \(i\) 时刻触碰到上或下边界的充要条件是存在一个 \(i\) 之前的时刻 \(j\) 满足 \(|s_i-s_j|\geq c\)。找出这个东西的前缀最大最小值,这个差值如果 \(\geq c\),那么最后一次触碰的边界一定在这两个后面,可以线段树二分找出来。

ARC146D

考虑如果所有的 \(X_i,Y_i\) 都不等于 \(1\),那么所有的点都可以取 \(1\),这样一定最小。

一旦存在有一个 \(X_i,Y_i\) 等于 \(1\),那么说的就是 \(A_{P_i}\geq X_i,A_{Q_i}\geq Y_i\)。这样递归处理限制,每个限制只会被处理一次,最后全部取最小的就行。

P12547

首先不难注意到区间里的 \(1\) 一定全选。然后问题变成删最少的 \(-1\) 使得条件满足。

考虑其前缀和折线,条件可以表示为,其前缀和任意一项非负,且最后一项是整个序列的 \(\max\)。删除一个 \(-1\) 会导致后面的整体向上平移一格。先考虑调整前缀和非负,容易发现删除的 \(-1\) 数量等于其前缀和最小值的绝对值(如果最小值为正就不用调整)。在考虑调整最后一项成整个序列的 \(\max\),但是发现这个跟序列 \(\max\) 后面删除了多少个 \(-1\) 有关。容易发现一个位置前面删除的 \(-1\) 个数为这个位置前面的前缀和最小值的绝对值。于是直接线段树维护就行了。

P9999

考虑把询问离线,维护一个数据结构,支持标记树上一个点,把树上标记的所有点往一个点的方向移动一步,查询标记的那个点现在走到了哪。

考虑把所有点向 \(x\) 移动一步,那么只有 \(x\) 根链上的点会向下移动,其他的点都是向上移动。所以给树树剖,那每条链上开一个平衡树可以维护。注意跨链要求我们快速找到有哪些点会跨链,这部分实现要精细一点。

有人可能会说复杂度不对,因为可能存在一些点在重链的端点处来回跨越。实际上跨链的次数总数最多是 \(O(q\log n)\)

posted @ 2025-08-16 14:47  Linge_Zzzz  阅读(3)  评论(0)    收藏  举报