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\) 数量乘起来即为答案。

posted @ 2023-07-13 08:30  MisterRabbit  阅读(33)  评论(0)    收藏  举报