[BZOJ2001][HNOI2010]城市建设(CDQ分治,线段树分治) 题面 BZOJ 洛谷 题解 好神仙啊这题.原来想做一直不会做(然而YCB神仙早就切了),今天来怒写一发. 很明显这个玩意换种做法可以用线段树分治做,那么只需要\(LCT\)动态维护一下\(LCT\)就好了,时间复杂度?似乎是\(O(nlog^2m)\)的,每条边放在线段树上是一个\(log\)的,\(LCT\)还要一个\(log\),然而常数十分大,大得一匹,洛谷上只能过\(80\)分. #include<iostrea…
题目链接 BZOJ2001 题解 CDQ分治神题... 难想难写.. 比较朴素的思想是对于每个询问都求一遍\(BST\),这样做显然会爆 考虑一下时间都浪费在了什么地方 我们每次求\(BST\)实际上就只有一条边不同,我们实际浪费了很多时间在处理相同的边上 那就考虑分治 对于一个待修改的边集,我们将其权值全部设为\(-\infty\),跑一遍\(BST\),此时其它边如果被选中,说明这些边在单独询问时也一定会被选,将这些边连的点缩点 同样,对于一个待修改的边集,我们将其权值全部设为\(\inft…
Problem 这题呢 就边权会在某一时刻变掉-众所周知LCT不支持删边的qwq- 所以考虑线段树分治- 直接码一发 如果 R+1 这个时间修改 那就当做 [L,R] 插入了一条边- 然后删的边和加的边存起来到栈 好删除贡献 注意一下最后一段加边-- 这题没了 #include <bits/stdc++.h> #define rep(i , x , y) for(register int i = (x) , _## i = ((y) + 1) ; i < _## i ; i ++) #d…
Description \(n\) 个点 \(m\) 条边的带边权无向图.\(q\) 次操作,每次修改一条边的权值. 求每次修改后的最小生成树的边权和. Hint \(1\le n\le 2\times 10^4, 1\le m, q\le 5\times 10^4, 1\le \text{边权}\le 5\times 10^7\) Solution 考虑对时间进行分治,\(\textbf{solve}(l, r)\) 表示处理第 \(l\) 到第 \(r\) 个操作,并对原图生效这些修改的过程…
[HNOI2010]城市建设 玄学cdq O(nlog^2n)的动态最小生成树 其实就是按照时间cdq分治+剪枝(剪掉一定出现和不可能出现的边) 处理[l,r]之间的修改以及修改之后的询问,不能确定是否加入的边集为E 对于会被改变边权的边,边集为Q,暂时不能确定 不妨大力假设: 都是-inf,这个时候把Q的边都加入之后,剩下的E进行kruskal如果还能加入,那么在[l,r]这个区间里的所有询问,一定都能加进去 并查集带着必须边,然后处理Q都是inf,剩下的E进行kruskal,如果还是不能加入…
[LG3206][HNOI2010]城市建设 题面 洛谷 题解 有一种又好想.码得又舒服的做法叫线段树分治+\(LCT\) 但是因为常数过大,无法跑过此题. 所以这里主要介绍另外一种玄学\(cdq\)分治 对时间进行分治 因为每次分治都必须要缩小数据规模 而我们这里貌似无法满足这个要求 引进了下面的玄学东西: 设当前边集的大小为\(n\),分治区间为\([l,r]\) 则对于分治区间内的边,我们有如下两种剪枝: \((1)Contraction:\) 将现在所有分治区间内的边权设为\(-\inf…
题目链接 线段树分治+LCT只有80 然后就有了CDQ分治的做法 把不可能在生成树里的扔到后面 把一定在生成树里的扔到并查集里存起来 分治到l=r,修改边权,跑个kruskal就行了 由于要支持撤销,并查集要按秩合并 #include"cstdio" #include"cstring" #include"iostream" #include"algorithm" using namespace std; const int M…
一个很显然的思路是把边按时间段拆开线段树分治一下,用lct维护MST.理论上复杂度是O((M+Q)logNlogQ),实际常数爆炸T成狗.正解写不动了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<vector> #include<…
神仙题 题目大意: 有一张\(n\)个点\(m\)条边的无向联通图,每次修改一条边的边权,问每次修改之后这张图的最小生成树权值和 话说是不是\(cdq\)题目都可以用什么数据结构莽过去啊-- 这道题目确实是\(cdq\)好题 \(cdq\)分治一定要处理多维偏序问题吗?并不是,它的核心思想是一个用子问题计算对另一个子问题的贡献 我们将这道题按照时间轴来分治,那么显然一个子问题对另一个子问题是存在贡献的 我们将整张图上的边进行分类: 在当前分治区间内涉及到修改的边称为动态边 其他边称为静态边 我们…
题目大意:动态最小生成树,可以离线,每次修改后回答,点数20000,边和修改都是50000. 顾昱洲是真的神:顾昱洲_浅谈一类分治算法 链接: https://pan.baidu.com/s/1c2lkayO 密码: 83rx 讲的很妙,大致的几个注意点在代码里面也有提到. #include <iostream> #include <cstdio> #include <cstdlib> #include <queue> #include <algori…