2026 集训7

前情提要

1A.CF2144E2

总感觉这题见过啊。但是没翻到提交记录。

考虑从最高点分成左右两边以此考虑。

在两个取到的峰中间的随便删。这个峰和下一个峰中间要是有一样的是不是还得钦定点东西。哦不用的,一样就一样,能堵住后边不漏出来就行。

?咋可能这么水。跑一下样例。哦哦会有问题。一样的话还得加上把前边删了,保留一个后边跟他相等的以及后边的。

例如样例 4 2 4 8 3,我们有两种方式得到 4 8 3。

貌似样例全过了。但是这是我手算的,实际上出现那个 3 5 5 7 4 6 7 2 4,中间的 7 4 6 7 2,要是不钦定点东西肯定算重。

有些困难,那就考虑 dp,还是考虑分前半段后半段分开算。

猜个表示 \(f_{i,j}\) 表示前 \(i\) 位其中 \(i\) 必保留,目前都满足原来的条件,\(i\) 作为第 \(j\) 个峰。

转移形如:

\[f_{i,j} = \sum_{a_k = a_i\land k<i} f_{k,j-1}2^{\sum_{x=k+1}^{i-1} [a_x \le a_k]} \]

貌似挺对的了。但是过不去 E2,能过 E1。切 *2200 了恭喜。

这东西看上去就很 DS。感觉像是权值线段树一边往里加一边查。如果遇到一个 \(a_l\),那就把所有 \(a_i \ge a_l\) 的乘 \(2\)。

感觉完事了吧。区间乘,单点加,单点求值。

不对啊我咋把 \(j\) 扔了。唐。

不对啊上一句话做梦说的,我这个事实上等价于把 \(j\) 当时间戳了。

呃。刚才说的比较模糊,我们把状态改成 \(f_{a_i}\),表示 \(a_i\) 是当前峰。

\[f'_{a_i} = f_{a_i} 2^{[a_l < a_i]} \]

那扫到一个 \(a_i\),他会让线段树上 \([a_i + 1,\infty)\) 乘 \(2\),即可达成这个效果。

同样的还得有一个从上一个峰累过来的贡献。

\[f_{lst} \to f_x \]

\(lst\) 就是上一个峰,这个东西可以随便维护。

16:26~16:46+18:06~18:52

2B.CF2145F

显然如果不会挨炸那一定往前走,如果下一步要挨炸就等一步。

我们只关心进来和出来时下一回合是哪类陷阱,这个状态数非常少可以打到矩阵里,\(M_{i,j}\) 表示从路径左端开始,开始时是 \(i\) 陷阱,走到右端且此时轮到 \(j\) 陷阱的最小步数。

这个我们可以直接 BFS 扫把矩阵算出来。

然后做一个 \(\min\) 加矩阵快速幂就通关了。

3C.CF2156E

显然做一轮操作就能确定出一边边界,确定两边答案就出来了,所以只有前两轮操作是有用的。

考虑二分答案,设当前答案为 \(x\),接下来考虑 check。

我们把和 \(a_i\) 差值至少为 \(x\) 的点叫做 \(i\) 的配对点。

交换操作顺序来看。

如果每个点都只有 \(1\) 个配对点,那后手锁 \(1\) 个,先手直接把他的配对点删了,如此往复肯定不能赢。

如果存在一个点有至少 \(2\) 个配对点,那后手锁住他,先手删掉其中一个配对点,后手再锁住另一个配对点就赢了。

所以说如果轮到后手时,还存在至少一个点存在多于 \(1\) 个配对点,后手必胜。

接下来回来看先手操作。

如果目前已经全是只有 \(1\) 个配对点的点了,后手就赢了。

如果现在有一个有 \(2\) 个配对点的点了,那先手可以随便删两个配对点以及这个点自己的其中一个。

如果现在有一个多于 \(2\) 个配对点的点,那先手只能删掉这个点自己。

所以先手删的点最多只有 \(3\) 种情况,枚举 check 即可。

4D.CF2169E

显然先手只会给后手留最多 \(4\) 个点用来组一个比较大的矩形,因为如果留多于 \(4\) 个点,当多余点在矩形内部时不如直接单点删,如果被框住显然没贡献;如果在外边可能会要一个更大的矩形,或者单独把他删了。不论如何都不优。

矩形周长就是 \(2(\max x-\min x+\max y-\min y) = 2\max x-2\min x+2\max y-2\min y\)。

设 \(f_s\) 表示这四项贡献被确定的状态为 \(s\) 的最大答案。

枚举到一个点,如果他不当矩形端点,那么 \(f'_s = f_s + c_i\)。

如果他当矩形端点,那么枚举他填的贡献的状态 \(t\),其中 \(t \lor s = \emptyset\),贡献称为 \(val\),转移 \(f'_{s \lor t} = f_s + val\)。

5E.CF2181G

稍微刻画一下他这个操作,感觉像是你选一堆不交区间,端点减 \(1\),内部减 \(2\),问你几步能全变成 \(0\)。

这步是咋想出来的呢。考虑他最多只能让 \(n-1\) 个位置有操作,然后贡献就是 \(1222\cdots2221\),缩小就是少一些 \(2\)。

类似一个最值分治的东西。

显然想让尽可能多的点减 \(2\),但是要是里边有 \(1\),就不得不让他当端点。

突然发现这是环。所以减 \(2\) 的也可能是所有区间外的部分。算了倍长一下得了。

样例有点弱啊咋玩都能过。


直接贺了题解。发现跟我这个转化毫无关系。

设每个 \(i\) 向 \(i \bmod n + 1\) 做了 \(b_i\) 次操作。那么:

\[a_1 = b_n+b_1\\a_2=b_1+b_2\\ \cdots \\ a_n = b_{n-1}+b_n \]

移项:

\[b_1 = a_1-b_n\\b_2=a_2-b_1\\\cdots\\b_n=a_n-b_{n-1} \]

左右加起来得到 \(\sum a = 2\sum b\)。

以此上带入下,得到:

\[b_2=a_2-b_1=a_2-(a_1-b_n)=a_2-a_1+b_n\\ b_3=a_3-b_2=a_3-(a_2-a_1+b_n)=a_3-a_2+a_1-b_n\\ b_4=a_4-b_3=a_4-(a_3-a_2+a_1-b_n)=a_4-a_3+a_2-a_1+b_n\\ \cdots\\ b_i=\sum_{j=1}^i (-1)^{i-j} a_j + (-1)^i b_n\\ \cdots\\ b_n=\sum_{j=1}^n (-1)^{n-j} a_j + (-1)^n b_n \]

那么如果 \(n\) 是奇数,我们可以直接算出 \(b_n\) 然后反推出所有 \(b\)。显然答案下界是 \(\max(\max b,\lceil\frac{\sum b}{n-1}\rceil)\)。

如果 \(n\) 是偶数,每个 \(b\) 都能表示为一个关于 \(b_n\) 的一次函数,\(\frac{\sum b}{n-1}\) 是定值,只需要让 \(\max b\) 尽可能小,显然这是单谷函数,三分 \(b_n\) 即可。

但是题解为啥要三分。这就是俩一次函数交点吗不是。

6F.CF2211E

啥字体,5 min切了。

一个显然的 dp 就是 \(f_u\) 表示把 \(u\) 子树划完的最小链数,\(g_u\) 表示 \(u\) 以及下面跟他所处同一条链的 \(\gcd\)。

有转移:

\[f_u = \begin{cases} \sum f_v & \exists v,\gcd(g_v,a_u) \neq 1\\ \sum f_v +1 & \forall v,\gcd(g_v,a_u) = 1 \end{cases}\\ g_u = \begin{cases} ? & \exists v,\gcd(g_v,a_u) \neq 1\\ a_u & \forall v,\gcd(g_v,a_u) = 1 \end{cases} \]

发现 \(u\) 要是能跟下边接上的时候我们不知道他要跟谁接,所以不会转移。

因为我们并不关心具体是哪个 \(v\) 接上了 \(u\),而是是否存在能接上 \(u\) 的 \(v\)。

所以我们改变 \(g_u\) 的定义为能使得 \(f_u\) 达到最小的,可能被保留下来的质因子的并,这个东西恰好就是 \(\operatorname{lcm}\) 可以做到的。

这样就可以转移了:

\[g_u = \begin{cases} \operatorname{lcm}_v \gcd(g_v,a_u) & \exists v,\gcd(g_v,a_u) \neq 1\\ a_u & \forall v,\gcd(g_v,a_u) = 1 \end{cases} \]

7G.CF2211F

组合意义天地灭,代数推导保平安。

设二分树上位置为 \(i\) 的点深度为 \(dep_i\),根节点深度为 \(1\)。

考虑一段连续区间 \([l,r]\) 内都是同一种数 \(k\),那二分找 \(k\) 的次数就是 \(\min_{i=l}^r dep_i\)。

现在看看有多少数组能让 \([l,r]\) 区间都是 \(k\)。

设 \(x_i = \sum_{j=1}^n [a_j = i]\)。

我们要求前边 \(\sum_{i=1}^{k-1} x_i = l-1\),其中 \(x_i \ge 0\)。直接插板 \(C_{l+k-3}^{k-2}\)。

后边可以在 \(k+1,\cdots,m\) 里边选,方案数 \(C_{n-r+m-k-1}^{m-k-1}\)。

这下暴力出来了:

\[\sum_{k=2}^{m-1} \sum_{l=1}^n \sum_{r=l}^n C_{l+k-3}^{k-2} \cdot C_{n-r+m-k-1}^{m-k-1} \cdot \min_{j=l}^r dep_j \]

发现上标和是定值 \(m-3\),下标和是 \(n+m+l-r-4\),那我们改枚举区间长度和 \(l\),重新写式子。

\[\sum_{k=2}^{m-1} \sum_{l=1}^n \sum_{len=1}^{n-l+1} C_{l+k-3}^{k-2} \cdot C_{n-l-len+m-k}^{m-k-1} \cdot \min_{j=l}^{l+len-1} dep_j\\ \sum_{k=2}^{m-1} \sum_{l=1}^n \sum_{len=1}^{n-l+1} C_{l+k-3}^{k-2} \cdot C_{n+m-len-3-(l+k-3)}^{m-k-1} \cdot \min_{j=l}^{l+len-1} dep_j \]

这样式子变得很可爱,我们枚举 \(d=l+k-3\),其中 \(k-2 \le d \le n-len+k-2\)。

然后这东西变成了一个标准的范德蒙德卷积。真的吗?

\[\sum_{k=2}^{m-1} \sum_{len=1}^n \sum_{d=k-2}^{n-len+k-2} C_{d}^{k-2} \cdot C_{n+m-len-3-d}^{m-k-1} \cdot \min_{j=d-k+3}^{d-k+len+2} dep_j \]

你发现这东西虽然看上去人畜无害,但是后边有个 \(\min_{j=d-k+3}^{d-k+len+2} dep_j\) 不让你卷,这是因为我们把 \(k\) 都换得跟区间有关了。

我们令 \(p=d-k+3\)。

第一个组合数变成 \(C_{d}^{d-p+1}\)。

第二个组合数变成 \(C_{n+m-len-3-d}^{n-len-p+1}\)。

那个烦人的 \(\min_{j=d-k+3}^{d-k+len+2} dep_j\) 直接变成 \(\min_{j=p}^{p+len-1} dep_j\)。

\[\sum_{len=1}^n \sum_{p=1}^{n-len+1} \sum_{d=p-1}^{p+m-4} C_d^{p-1} \cdot C_{n+m-len-3-d}^{n-len-p+1} \cdot \min_{j=p}^{p+len-1}dep_j \]

把那个 \(\min\) 拿出去。

\[\sum_{len=1}^n \sum_{p=1}^{n-len+1} \min_{j=p}^{p+len-1}dep_j \sum_{d=0}^{n+m-len-3}C_d^{p-1} \cdot C_{n+m-len-3-d}^{n-len-p+1} \]

这下可以卷了。

\[\sum_{len=1}^n \sum_{p=1}^{n-len+1} \min_{j=p}^{p+len-1}dep_j C_{n+m-len-2}^{n-len+1} \]

观察一下这个东西,是一个区间极值乘一个只跟长度有关的权值。

设当前位置为 \(i\),\(dep_i\) 为最小值的区间左端点有 \(x\) 种选法,右端点有 \(y\) 种选法能让 \(dep_i\) 成为区间最小值。

那么 \(i\) 的贡献就是 \(dep_i\sum_{a=1}^x \sum_{b=1}^y C_{n+m-a-b-1}^{n-a-b+2} = dep_i \sum_{a=1}^x \sum_{b=1}^y C_{n+m-a-b-1}^{m-3}\)。

现在要化 \(\sum_{a=1}^x \sum_{b=1}^y C_{n+m-a-b-1}^{m-3}\)。

先看 \(b\) 这边。

\[\begin{aligned} \sum_{b=1}^y C_{n+m-a-b-1}^{m-3} &= \sum_{j=n+m-a-y-1}^{n+m-a-2} C_j^{m-3}\\ &= \sum_{j=0}^{n+m-a-2} C_j^{m-3} - \sum_{j=0}^{n+m-a-y-2} C_j^{m-3}\\ &=C_{n+m-a-1}^{m-2}-C_{n+m-a-y-1}^{m-2} \end{aligned} \]

也就是上指标求和之后前缀和相减。

\(a\) 同理,最终得到:

\[C_{n+m-1}^{m-1}-C_{n+m-x-1}^{m-1}-C_{n+m-y-1}^{m-1}+C_{n+m-x-y-1}^{m-1} \]

这样就完事了,吗?

我们最开始的式子要求 \(2\le k \le m-1\),不然组合数没意义,所以还需要单独算一下 \(k=1\) 和 \(k=m\)。

\(k=1\) 时,所有 \(1\) 一定都从位置 \(1\) 开始,如果有 \(len\) 个 \(1\),那么贡献为:

\[C_{n-len+m-2}^{m-2} \cdot \min_{j=1}^{len} dep_j \]

因此:

\[\sum_{len=1}^n C_{n-len+m-2}^{m-2} \cdot \min_{j=1}^{len} dep_j \]

\(k=m\) 同理:

\[C_{n-len+m-2}^{m-2} \cdot \min_{j=n-len+1}^{n} dep_j \]

因此:

\[\sum_{len=1}^n C_{n-len+m-2}^{m-2} \cdot \min_{j=n-len+1}^{n} dep_j \]

最终整理一下答案式子:

\[\boxed{ \begin{aligned} Ans={}& \sum_{i=1}^n dep_i \left( C_{n+m-1}^{m-1} -C_{n+m-x_i-1}^{m-1} -C_{n+m-y_i-1}^{m-1} +C_{n+m-x_i-y_i-1}^{m-1} \right)\\ &+\sum_{len=1}^n C_{n-len+m-2}^{m-2} \min_{j=1}^{len}dep_j\\ &+\sum_{len=1}^n C_{n-len+m-2}^{m-2} \min_{j=n-len+1}^{n}dep_j \pmod {676767677}. \end{aligned} } \]

8H.CF2237F

本篇题解抛弃了大脑,可能引人不适,谨慎阅读。

设 \(f_{i,j}\) 表示前 \(i\) 位都合法,第 \(i\) 位强制为 \(j\) 的最小操作次数。

简单转移:

\[f_{i,j} = \begin{cases} \min f_{i-1,k} + [a_i \neq 1] & j=1\\ \min(f_{i-1,j-1},f_{i-1,m}) + [a_i \neq j] & j>1 \end{cases} \]

先滚一下数组。计 \(x=f_m,mn=\min f_j\)。

那转移相当于什么,原来一个 \([f_1,f_2,\cdots,f_m]\),这一轮变成 \([mn,\min(f_1,x),\min(f_2,x),\cdots,\min(f_{m-1},x)]\)。

后边这个 \([a_i \neq j]\) 状物,全局加,单点减即可。

所以说这是一个全局 \(\min\),头插,尾删,全局对 \(x\) 取 \(\min\),全局加,单点减。显然可以 Treap 维护。

9I.CF2239D

发现这题很难,所以我抄题解了。

首先把叶子都选上,如果是一堆环那么每个环都至少选出一个点,这是合法的充要。

我们钦定 \(S=\{1,2,\cdots,m\}\),最后算出来的方案数再乘 \(C_n^m\) 就行。

直接算很困难,考虑容斥。

第一个限制非常好做,也就是每个叶子编号都 \(>m\)。

考虑设 \(f_k\) 表示 \(k\) 个点组成若干个长度至少为 \(2\) 的环,\((-1)^{环数}\) 的和。

发现这也难算,考虑放宽限制,允许自环设为 \(g_k\)。

所以有:

\[g_k = \sum_{i=0}^k C_k^i (-1)^{k-i} f_i \]

意思是,我们选出来 \(i\) 个点成环,其他的都自环。

发现这简直就是二项式反演,要是能算出 \(g\) 就通关了。

首先 \(g_0=1,g_1=-1\)。

接下来考虑 \(k\ge 2\),我们交换其中两个点的出点。

如果这两个点在同一个环里,那这个环变成两个环了。

如果不在同一个环里,合并两个环变成一个环了。

因此所有方案两两抵消,当 \(k\ge 2\) 时,\(g_k = 0\)。

带到反演式里边可以求出 \(f_k = 1 - k\)。

我们把钦定叶子数称为 \(i\),环大小称为 \(j\)。

所以这个贡献就是 \(C_{n-m}^i \cdot C_{n-m-i}^j \cdot (1-j) \cdot (-1)^i\)。

然后开始连边,叶子只能连向剩下的点,方案数 \((n-i-j)^i\)。剩下的点同样 \((n-i-j-1)^{n-i-j}\)。

环上的我们算 \(f\) 的时候已经算过了。

整理一下目前式子:

\[\sum_{i=0}^{n-m} \sum_{j=0}^{n-m-i} C_{n-m}^i \cdot C_{n-m-i}^j \cdot (1-j) \cdot (-1)^i \cdot (n-i-j)^i \cdot (n-i-j-1)^{n-i-j} \]

接下来开始化式子。

令 \(k=i+j\),式子变成:

\[\sum_{k=0}^{n-m} C_{n-m}^k \cdot (n-k-1)^{n-k} \cdot \sum_{j=0}^k C_k^j (k-n)^{k-j} \cdot (1-j) \]

要是 \(\sum_{j=0}^k C_k^j \cdot (k-n)^{k-j} \cdot (1-j)\) 化开就通关了。

\[\sum_{j=0}^k C_k^j \cdot (k-n)^{k-j} \cdot (1-j)\\ = \sum_{j=0}^k C_k^j \cdot (k-n)^{k-j} - \sum_{j=0}^k j \cdot C_k^j \cdot (k-n)^{k-j} \]

分别处理两边,左边二项式定理:

\[\sum_{j=0}^k C_k^j \cdot (k-n)^{k-j} = (k-n+1)^k \]

右边:

\[\sum_{j=0}^k j \cdot C_k^j \cdot (k-n)^{k-j}\\ =k \sum_{j=0}^k C_{k-1}^{j-1} \cdot (k-n)^{k-j}\\ =k\cdot (k-n+1)^{k-1} \]

完事完事。整理一下式子:

\[\sum_{k=0}^{n-m} C_{n-m}^k \cdot (n-k-1)^{n-k} \cdot ((k-n+1)^{k} - k\cdot(k-n+1)^{k-1}) \]

10.AT_abc317_f

看见这个数据范围考虑数位 dp。

设 \(f_{len,x,y,z,limitx,limity,limitz,zerox,zeroy,zeroz}\) 表示到第 \(len\) 为,每个数取模之后是多少,以及 \(limit\) 和 \(zero\)。

进行一个有力气的转移即可。

11K.AT_abc341_f

唐完了,首先只建能传递棋子的边,这样出来了一个 DAG。

发现这就等价于一个体积为 \(w_v\),背包大小为 \(w_u-1\),价值为 \(f_v\) 的 01 背包,直接做转移即可。

每个点有几个棋子都是独立的,每个棋子贡献都是 \(f_u\),所以答案为 \(\sum f_u a_u\)。

12L.AT_abc344_f

好像之前做过序列版的这题。好像是买邮票啥的,总之就是在一个地方把接下来需要的钱都挣了,然后走过去。

然后设 \(f_{i,j,k,l}\) 表示到 \((i,j)\),经过的最贵的刷钱的地方是 \((k,l)\) 的最小步数及最小步数最大花费。

根据实际意义转移即可。

13.AT_abc374_f

首先如果我们可以枚举时间那就可以做出来一个简单的 dp。

设 \(f_{i,j}\) 表示第 \(i\) 天处理完前 \(j\) 个物品的最小代价。

\[f_{i+1,j} \gets \min(f_{i+1,j},f_{i,j})\\ f_{i+x,j+\min(k,cnt)} \gets \min(f_{i+x,j+\min(k,cnt)},f_{i,j}+\sum_{k=j+1}^{j+m}(t-a_i)) \]

其中 \(cnt\) 是到目前为止的订单数量。

但是时间太大了根本不能枚举。

考虑一辆车,他里边最晚的物品是 \(a_r\),上一辆车在 \(T\) 发出,那他最早可以在 \(\max(a_r,T+x)\) 发出,你接着往前找,发现每个时刻都可以写成 \(a_p + qx\) 的形式,而我们最多发车 \(n\) 次,所以 \(0\le q \le n\),这样就只有 \(O(n^2)\) 个时间了,直接进行上边的转移即可。

14.AT_abc387_f

啥字体。

建出来内向基环树之后,环上必须都是同一个颜色,除此之外的点颜色都比父亲小。

可以把环缩掉,这样做 dp 就好了。设 \(f_{u,j}\) 表示 \(u\) 子树内 \(u\) 的颜色为 \(j\) 的方案数。

转移:

\[f_{u,j} = \prod_{v \in son_u} \sum_{k=1}^j f_{v,k} \]

这样就可以了。

15O.AT_abc400_f

看见他让你 \(O(n^3)\) 做,还是区间染色类问题,考虑区间 dp。

设 \(f_{l,r}\) 表示 \([l,r]\) 的答案。

转移:

\[f_{l,r} = \min(f_{l,r-1}+f_{r,r},\min_{\substack{k=l\\c_k=c_r}}^{r-1} f_{l,k} + f_{k+1,r}+r-k) \]

水水?!

16P.AT_abc404_f

考虑高桥选按钮的最优策略貌似无法用一个简单的贪心描述,考虑 dp。

观察题解后发现,这个选按钮状态数非常少,也就是 \(a_1 \le a_2 \le \cdots \le a_n,\sum a = m\) 的东西。

通过如下程序,我们可以得到状态数最多为 \(5604\)。

#include<bits/stdc++.h>
using namespace std;
#define main(x) MiAn();int mIaN();main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;if(strlen(#x))cin>>t;while(t--)mIaN();cerr<<"Time: "<<1.0*clock()/CLOCKS_PER_SEC<<"s\n";}int mIaN()
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define mem(a,b) memset((a),(b),sizeof(a))
#define all(x) (x).begin(),(x).end()
#define abs_(x) ((x)<0?-(x):(x))
#define sz(x) ((int)(x).size())
#define ull unsigned long long
#define pb push_back
#define fi first
#define se second
int m;
int ans;
void dfs(int len,int x,int sum){
    if(len==m){ans+=(sum==m);return;}
    if(sum>m){return;}
    rep(i,x,m){dfs(len+1,i,sum+i);}
}
int main(){
    cin>>m;
    dfs(0,0,0);
    cout<<ans<<"\n";
    return 0;
}

那我们可以枚举状态了,枚举当前选按钮状态,设 \(f_{i,j}\) 表示还能打 \(i\) 轮,距离胜利还差 \(j\) 次,有转移。

\[f_{i,j}=\max_{\substack{1\le a_1\le\cdots\le a_{len}\\\sum a_x=m,\ len\le n}}\frac{(n-len)f_{i-1,j}+\displaystyle\sum_{x=1}^{len}f_{i-1,j-a_x} }{n} \]

就是说抽到关键按钮概率均匀随机,\(\frac{1}{n}\) 概率。

也有可能完全就没操作关键按钮,\(\frac{n-len}{n}\) 概率。

这样转移就完事了!

posted @ 2026-11-02 17:49  \endl/  阅读(3)  评论(0)    收藏  举报