CF 杂题选做
来源:笔者在vp中认为比较好的一些题目
每道题前会有tag,可以根据自己所需使用。(Ctrl+F请按照表格所给tag)
目前存在tag:难度评分,构造,树形DP
CF1515F
tag:构造,2600
给定一张图,点有点权 \(a_u\),每次操作选择两个相邻的点 \((u,v)\),如果 \(a_u+a_v \ge x\),则将两个点合并,问最后能否将所有点缩为一个。
思维比较妙的题。容易发现,如果所有的点不在一个连通块中,或者所有点的点权和 \(<(n-1)\times x\),那么是无解的。
观察样例,我们发现将所有点合并的过程其实是找出了一棵原图的生成树。那么对于一个有解的图,是否对于任何一棵生成树都是一个合法解呢?我们尝试归纳证明这一点:
在一个图的生成树上,我们对一个叶子进行分类讨论:
- \(a_u \ge x\) 那么它能和 \(fa\) 直接合并,此时原树变成了一棵 \(n - 1\) 个点的树,仍然满足限制条件。
 - \(a_u<x\) 那么我们直接删去这个叶子和这条边,剩下部分一定是满足题意的,我们最后将 \(u\) 和 \(fa\) 合并即可。
 
我们的解法也可以基于这一点:在dfs生成树的时候,我们从叶子开始,满足条件的边加入队列中,不满足的放入栈中,按顺序输出队列中和栈中的边即可,由上面的归纳证明可知这样的方案一定是正确的。
CF1276D
tag:树形DP,2900
给定一棵树,树上的所有点都没有颜色,按编号从小到大考虑每条边:如果连接的两点都没被染色,就任取一点染色,加入序列,否则跳过。问不同的染色序列数量。
定义一个点被一条边染色为,选择这条边是将该点染色。
定义一条连接 \(u,v\) 的边的编号为 \((u,v)\)。
考虑对于树上的一个点 \(u\),每个点有四种情况:
- 这个点被父亲边染色了
 - 这个点被编号小于父亲边的边染色了
 - 这个点被编号大于父亲边的边染色了
 - 这个点还没有被染色
 
我们可以据此设计dp状态:设 \(f_{u,0/1/2/3}\) 分别表示 \(i\) 被比父亲小的边染色,被父亲染色,比父亲大的边染色,没被染色的方案数,当前遍历到的儿子是 \(v\),\(w\) 是 \(u\) 除 \(v\) 外的其他儿子:
- 对于 \(f_{u,0/2}\)
- 钦定 \((u,v)\) 这条边将 \(u\) 删去,\(v\) 此时还未被染色,或者比 \(u\) 更晚染色,取 \(f_{v,2/3}\)。
 - 如果 \((u,w) < (u,v)\),则染色的均为 \(w\),或 \(w\) 在此之前已经被染色,取 \(f_{v,0/1}\)。
 - 如果 \((u,w) > (u,v)\),则 \(w\) 不会被 \((u,w)\) 这条边染色,取 \(f_{v,0/2/3}\)。
 
 - 对于 \(f_{u,1}\),转移为 \(\prod\limits_{(u,v)<(fa,u)}(f_{v,0}+f_{v,1})\prod\limits_{(u,v)>(fa,u)}(f_{v,2}+f_{v,3})\)。
 - 对于 \(f_{v,3}\),转移为 \(\prod\limits_{v}(f_{v,0}+f_{v,1})\)。
 
读者自证不难,答案为 \(f_{rt,0}+f_{rt,2}+f_{rt,3}\)。
CF1495D
tag:最短路,2600
给定一张图,定义这张图的生成树为从根到任意点的距离均为原图最短路的树,记 \(f(i,j)\) 表示同时满足 \(i\) 和 \(j\) 是树根的生成树的数量。求所有的 \(f(i,j)\)。
我们研究树的性质,发现如果原来在图上的边是 \((i,j)\) 最短路上的一部分,那么这条边在生成树上也要选择。反证不难。那么如果 \((i,j)\) 之间出现两条以上最短路径时,\(f(i,j)\) 是无解的,出现了环。
此时 \((i,j)\) 最短路为必连边。不在最短路上的点,我们考虑有多少点可以做它的 \(fa\)。对于点 \(u,fa\),需要满足 \(dis(i,fa) + 1 = dis(i, u)\) 且 \(dis(j,fa) + 1 = dis(j, u)\)。将所有点满足的 \(fa\) 数量乘起来即为答案。

                
            
        
浙公网安备 33010602011771号