CSP 模拟13

T4 原题 思路也会 但是就是不会写dfs 结果挂成了20分
我好菜啊

A:Tree

直接把所有边权加起来就好了
考虑构造一种合法的排列
使得每一条边都被充分利用到
即并没有被其他边所限制
只要按照大小排序
然后依次加边就好了
然后发现其实就是所有边权之和





B:Permutation

最优的结果肯定是 :
i都比i+1靠前 或者距离小于k

所以可以贪心的去交换
换到不能再换就搞出目标答案了
但是复杂度是有问题的




正解是建边 跑拓扑序
然鹅并不会 洛谷题解





C:Graph

一样结论题
考试的时候没想出来
先考虑树的情况
最优的方案一定是
每个点的儿子内部匹配
如果儿子数为偶数可以直接匹配完
如果儿子数为奇数那就和父亲匹配
最后最多只会剩下一条边没有匹配

这种构造可以扩展到无向图的情况
首先跑出一颗dfs序
对于非树边
可以把非树边当成树边处理
即对于一个点
如果dfs到了它的祖先节点
那么可以把祖先节点当成它的子节点去计算
然后一样匹配就好了
因为这样肯定是不会冲突的
而且能保证一定是最大化匹配数
所以这种构造是合理的





D:十字绣

原题
计算每个点被正面多少个覆盖了 反面多少个覆盖了
然后dfs
对于每个联通块 让ans += 各个点被正面和被反面覆盖的差的绝对值
最后ans /2 就是这个联通块的贡献
每次起针一定是从一个差不为0的地方下手 最后从一个差不为0的地方出来
这样每次操作一定会消耗掉两个差 所以最后ans/2就是该点的贡献
但是还有一种情况
就是类似于
正面./. 反面./.
这样的联通块其实对答案也是贡献1的
但是按照上面的计算方法并不会对答案造成贡献
所以特判一下如果联通块贡献为1
就让答案+1

posted @ 2020-10-11 08:35  HISKrrr  阅读(93)  评论(2编辑  收藏  举报