第一题很简单嘛,就是裸的动态树分治嘛
对于每一层的重心维护子树路径的信息和子树到上一层重心的点的信息
空间复杂度O(nlogn)
对于每一层我们按dis排序,之后记录军队数量的前缀和
查询的时候我们只需要在这一层二分既可以啦
感觉还是非常的easy呢
时间复杂度O(nlog^2n+mlog^2n)
PS:原本题目并不是这个样子
原本是想出成有k个人在攻打城池u,问u需要坚持多少时间才能使得到来的军队人数总数>=k
这样我们就可以在外层二分一个时间,问题就转化成了这道题了(多了个log)
原本是想出成可以动态改变某个结点的军队数量的
这样我们对于每一层的更改需要用树状数组维护前缀和了(又多了个log)
写完之后发现O(nlog^4n)连暴力都比不上QAQ
所以就改成这样子的题目了
并没有强制在线,因为貌似离线有奇怪的做法可以A
(我估计并不会有人想出来
第二题更简单,本来想再出一道树分治,结果出着出着就变成CDQ了
显然的三维偏序嘛,直接裸上CDQ就可以啦(良心的签到题)
就是第一维排序,第二维CDQ,第三维树状数组就好了
但是也是有奇怪的做法的,譬如第一维排序,剩下两维树套树搞定
或者第一维排序,剩下两维KD_Tree搞定(这是我的对拍的写法。。)
还有个梗:知道五维偏序肿么做么?我不会告诉你n^2暴力比nlog^5n的做法要快的多
第三题是个图论题
Em 第二题给的树但不是树,第三题没给树却是树 QAQ
首先我们知道对于任意一个边双联通分量里的任意两点相互一定可达
那么我们可以把边双联通分量缩点,原图无环就是个生成森林啦
之后就随意在树上打下标记,最后DFS一次判断是否无解就可以了
时间: 2024-12-31 03:45:33