2022.10.19 模拟赛小结

(一场难度稍微低 1丶丶的模拟赛,不过我太弱了,依然没多少分。。。)

更好的阅读体验戳此进入

赛时思路

T1

给定 n 个点 m 条无向边,删除一个点要消耗和这个点直接连接的所有点的权值和,求删除所有点最小的消耗。

原题是 CF437C The Child and Toy

想到了几个贪心,如按照节点对其它节点的贡献,或节点本身被贡献的去排序,亦或做差考虑最终的贡献排序,想了好多人类智慧,然后都假掉了。。。

至于为什么假了也能想到,这样的排序实际是一个动态的过程,是不能根据最开始的状态无脑排序的,然而动态的这玩意似乎难以维护,如果每次删除并插入难以实现,每次重排的话大概是 O(mnlogn) 的,和无脑暴力一样,所以最后 T1 寄了,只有 20pts

Code

T2

原题是 LG-P7152 [USACO20DEC] Bovine Genetics G

不会

T3

原题是 P7154 [USACO20DEC] Sleeping Cows P

不会

T4

给定 n 个节点以 1 为根的树,初始所有点权值为 0m 次修改每次将 u 所在子树中距离 u 不大于 d 的点权值增加 v,求最后每个点的权值。

原题是 CF1076E Vasya and a Tree

最开始想口糊一个在树上的动态建点的 ODT,然后发现建不出来。。然后尝试找了半天性质口糊了一个奇怪的做法:对于本题我的想法就是把子树覆盖转换成序列上的操作问题,然后最后想到了把树按照 bfs 序标号,这样的话每一层都会是一个连续的区间,然后我们记录每一个非叶子节点子树所在的下一层的区间,每次修改的时候这样跑一遍。。理论上在随机数据上都能过,但是一条链的话直接退化成比暴力常数还要大的暴力,而且我不知道咋想的区间操作的时候写了个没有 assign 的 ODT,结果基本全寄了,因为这玩意没有区间推平本身就完全用不了 ODT,一直在 Split,反应过来之后想改线段树没改完。。。在随机数据上基本都卡在了 1000ms 左右,刚好寄了。。链上的测试点直接过不了。最后 30pts50pts 不等,测评波动。。

Code

正解

T1

考虑把删点变成删边,对于删除每条边,显然其贡献为两个端点中的一个的权值,所以遍历每条边答案加上两个端点中的最小值即可。

Code

T2

咕咕咕。

T3

咕咕咕。

T4

考虑把修改离线,记录每个点上的所有修改,然后做一个奇怪的树上差分,搜索的时候考虑把每一个深度记录在当前搜索的子树内对应的差分值,然后每搜到一个点先加上对应的差分值,把它的修改加到答案里,然后在对应的差分的结束的地方减去这个值,当搜完节点所在子树的时候,要搜其它的子树了,这个节点子树的差分桶就不再有效了,所以此时将之前的修改回退一下即可。

Code

UPD

update-2022_10_19 初稿