并查集
mayaohua2003
这个作者很懒,什么都没留下…
展开
-
Codeforces 571D
做法很多,这里给一个比较优秀的仅使用并查集的做法。不管是大学还是军队,它们的合并关系其实给定了两棵树,每次即是合并两个点。合并的时候,我们可以新建一个虚点,让原来两个点所在连通块的根连到虚点,这样标记不会错位。这样如果仅有大学的操作,我们可以每次给某个连通块的根打一个加法标记,每次询问的即是某个点到连通块根路径的权值和,这个容易用带权并查集实现。现在加上了军队的操作,可以发现一个点我们仅需要知...原创 2019-12-10 23:14:04 · 213 阅读 · 0 评论 -
Codeforces 576E
这种问题,可以很套路的用线段树分治+可回退并查集解决。对每种颜色维护一个可回退并查集,至于二分图的判定,将每条造成奇环的边打个标记就好了,回退的时候撤销一个标记,看一下是否存在标记就行了。不过这题比较恶心的地方是某条边在某个时间的颜色不是一开始已知的,这个也不难解决,我们递归到叶子节点的时候判断一下是否能修改成功,然后再对下一段时间插入正确的颜色就好了。时间复杂度O(nk+mlog2n)\m...原创 2019-11-11 20:40:06 · 196 阅读 · 0 评论 -
Atcoder arc098F
这里给一个智障做法,不会贪心的选手默默流下了眼泪。容易发现我们会在最后一次经过某个节点的时候捐款,这样考虑捐款的序列PPP,那么PPP的每个后缀都是连通的,所需的钱数即为max(∑j=1i−1BPj+APi)\max(\sum_{j=1}^{i-1}B_{P_j}+A_{P_i})max(∑j=1i−1BPj+APi)(似乎贪心的做法也要这一步)。我们考虑二分最后剩下的钱数ddd,...原创 2019-11-02 19:56:21 · 345 阅读 · 0 评论 -
Codeforces 516D
有个一眼的线段树分治+并查集的O(nqlog2n)\mathcal O(nq\log^2n)O(nqlog2n)的做法,看起来很不能过。利用一下题目的特殊性质,每个点距离ddd最远的叶子肯定是直径的一端。考虑存在一个ddd最小的点,以它为根的话,每个点的ddd都不小于父亲的ddd。这样就可以two pointer了,按ddd从大到小扫描,拿并查集合并一下即可,复杂度O(nqα(n))\math...原创 2019-11-02 19:34:45 · 235 阅读 · 0 评论