别样的典题大战 1

CF1658D2

不难发现答案只有 \(O(n)\) 种,一种暴力的想法是枚举每个答案并检验。

发现瓶颈在于检验太慢,于是使用 01-trie 加速。每次检验只需求出这个答案对 \(a_{1\sim n}\) 的最小最大异或和是否分别是 \(l,r\) 即可。

D1 严格弱于此题,不再赘述。

代码

abc290f

通过某些方式猜出了答案,但是做法过于神秘。这里还是说正经做法。

显然 \(\sum x_i=2n-2\)。于是你考虑怎么分配。首先如果你有 \(t\) 个非叶子节点,那你一定能够造出来一个直径 \(t+1\) 的树,这个构造显然最优,且不难发现其合法。

我们钦定恰好有 \(k\) 个叶子节点,那么剩下 \(n-k\) 个都是非叶子节点,现在的方案数为 \(\binom{n}{k}\)。于是我们要把 \(n-2\) 个自由度分配到 \(n-k\) 个点上,显然直接插板即可,得到 \(\binom{n-3}{n-k-1}\)

所以我们相当于要求 \(\displaystyle\sum_{k=1}^{n}\binom{n}{k}\binom{n-3}{n-k-1}(n-k+1)\)。下面就是严肃推式子。

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

\[=\sum_{k=1}^{n}\binom{n}{k}\binom{n-3}{n-k-1}(n-k-1)+2\times\sum_{k=1}^{n}\binom{n}{k}\binom{n-3}{n-k-1} \]

\[=\sum_{k=1}^{n}\binom{n}{k}\binom{n-4}{n-k-2}(n-3)+2\times\binom{2n-3}{n-1} \]

\[=(n-3)\times\binom{2n-4}{n-2}+2\times\binom{2n-3}{n-1} \]

直接 \(O(1)\) 计算即可。

代码

CF1922F

一眼区间 dp。设 \(f_{l,r,x}\) 表示把区间 \([l,r]\) 全部变成 \(x\) 的最小次数。答案显然是 \(\min_{k=1}^{x}f_{1,n,k}\)

注意到如果我能用 \(u\) 步把一个区间全部变成 \(k\),那么我就可以用至多 \(u+1\) 步把这个区间变为任意数。于是有 \(f_{l,r,i}\leftarrow \min_{i=1}^{x}f_{l,r,i}+1\)

显然我们可以把区间拆为两半进行合并转移。于是有 \(\displaystyle f_{l,r,i}\leftarrow\min_{k=l}^{r-1}f_{l,k,i}+f_{k+1,r,i}\)

然后你把这两个转移写了出来,发现连样例都过不去。

我们考虑两个区间的合并。如果说,左区间的右端点和右区间的左端点都不是我们的目标颜色的话,我们可以把对这两部分进行的 \(2\) 次操作合成为 \(1\) 次操作。所以我们真正的转移应该是 \(\displaystyle f_{l,r,i}\leftarrow\min_{k=l}^{r-1}f_{l,k,i}+f_{k+1,r,i}-[a_k\ne i\wedge a_{k+1}\ne i]\)

时间复杂度 \(O(n^4)\),常数很小,所以能过。

代码

CF1830E

3500,何意味。

如果 \(p_n=n\),那么我们直接 \(n\leftarrow n-1\) 显然没有影响。

于是我们现在找到了位置 \(i,j\) 满足题目中的要求。令 \(k=j-i\),那么显然 \(p_{i+1\sim j-1}\) 都比 \(p_i\) 小且都比 \(p_j\) 大。于是你的逆序对个数会减少 \(2k-1\)。同时你的 \(p_i,p_j\) 移动的方向一定是对的,所以 \(\displaystyle\sum_{i=1}^{n}|i-p_i|\) 会减少 \(2k\)

显然最后这两个东西都应该是 \(0\) 的。所以我们的操作次数就是 \(\displaystyle\sum_{i=1}^{n}|i-p_i|-\sum_{i=1}^{n}\sum_{j=1}^{i-1}[p_j>p_i]\)

前者显然随便维护,后者直接上 cdq 分治维护动态逆序对即可。

代码

abc264e

首先把所有发电站全都认为是 \(0\)。然后相当于问你 \(0\) 所在连通块有多少点。需要支持删边。

直接离线下来倒序操作变为加边,用并查集维护即可。

代码

abc264g

为何是蓝。

考虑建图。连接以下 \(3\) 种边。

\[0\rightarrow a(val_a) \]

\[a\rightarrow ab(val_b+val_{ab}) \]

\[ab\rightarrow bc(val_c+val_{bc}+val_{abc}) \]

\(0\) 出发跑最长路即可,需要判有无正环。直接用 SPFA 即可。

代码

abc263g

先把 \(1\) 丢掉,所以我们现在只能凑出来奇质数了。显然只能一个奇数配一个偶数,于是可以建出来一个二分图,直接上网络流跑最大匹配。

接下来再把 \(1\) 加进去跑一遍,剩下的 \(1\) 自己抵消一下即可。

代码

arc121d

不是哥们,这是啥啊?

直觉告诉我们,我们直接最大配最小这样弄是比较优秀的。于是就有一个做法,枚举放几个 \(0\) 进去,然后直接贪心。

然后你发现你过了。

代码

abc262g

注意到,若一个序列能够变成单调不降的,那么必然存在一个划分点,使得前半部分全都 \(\le a_1\),后半部分全都 \(\ge a_1\)

于是有一个 dp,\(f_{l,r,u,v}\) 表示区间 \([l,r]\) 内只选 \([u,v]\) 的数能选出来的最长的能成为单调不降序列的子序列的长度是多少。

直接把 \(a_l\) 删掉转移显然:\(f_{l,r,u,v}\leftarrow f_{l+1,r,u,v}\)

否则若 \(u\le a_l\le v\),有转移:\(f_{l,r,u,v}\leftarrow f_{l,k,u,a_l}+f_{k+1,r,a_l,v}+1\)

代码

CF1349C

显然,一个格子一旦开始变化,那么它每一轮都会变化。

于是我们只需找出每个格子最早第几轮开始变化。这可以直接跑最短路(bfs)。

代码

CF958C3

经典 C2 做法推广不到 C3。

首先 \(f_{i,j}\) 表示前 \(i\) 个划成 \(j\) 段。直接做显然 \(O(n^2k)\)

比方说你现在从 \(x\) 转移过来,那你的贡献就是 \((s_i-s_x)\bmod p+f_{x,j-1}\),然后你注意到这玩意本质上是前 \(i\) 个数进行了分组对 \(p\) 取模,也就是说实际上模 \(p\) 的余数是一定的。

于是我们宣称,只需比较 \(f_{x,j-1},f_{y,j-1}\) 的大小即可确定从哪里转移更优。显然,若 \(f_{x,j-1}\le f_{y,j-1}\),从 \(y\) 转移一定不优于从 \(x\) 转移。

于是对每个 \(j\) 记录 \(f_{i,j}\) 最小的 \(i\) 即可。

代码

CF405E

首先不难猜出当且仅当有奇数条边无解。

这种问题从树开始考虑会比较容易。显然我们处理完一棵子树之后,至多剩一条边。那么对于 \(u\) 的所有儿子 \(v\),我们只需要考虑 \(v\) 子树是否匹配干净。

如果匹配完了,则只需要把 \(v\) 压入 \(g_u\),否则直接将 \(u,v,g_{u,0}\) 作为一组匹配即可。

现在树加上了一些返祖边,直接把返祖边压进祖先的 \(g\) 里处理即可。

代码

CF300D

注意到本质不同的正方形数量不太多,我们按至多能划分多少层对其分类即可。

\(f_{i,j}\) 表示 \(i\) 层的正方形用了 \(j\) 次操作得到图形的种类数。转移:\(\displaystyle f_{i,j}=\sum_{a+b+c+d=j-1}f_{i-1,a}f_{i-1,b}f_{i-1,c}f_{i-1,d}\)

但是这样显然复杂度爆爆爆了。考虑优化。设立中间数组 \(g_{i,j}\),有 \(\displaystyle g_{i,j}=\sum_{a+b=j}f_{i,a}f_{i,b}\),然后用 \(g\) 去转移 \(f\)。于是做到了 \(O(k^2\log n)\)

代码

CF406D

我以为很难来着。

发现相当于求一棵树上两点的 lca,于是难点在于建树。不难发现只需倒着维护一个上凸壳即可。

代码

posted @ 2025-12-16 15:32  zxh923  阅读(11)  评论(0)    收藏  举报