随笔分类 -  数据结构—并查集

摘要:读题两小时系列…… 在读懂题意之后,发现M(c)就是c这块最大权割边也就是的最小生成树的最大权边的权值,所以整个问题都可以在MST的过程中解决(M和c都是跟着并查集变的) 不过不是真的最小生成树,是合并了所有a[i].w include include include using namespace 阅读全文
posted @ 2019-05-02 21:39 lokiii 阅读(298) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2019-04-23 21:48 lokiii 阅读(4) 评论(0) 推荐(0)
摘要:如果没有环的话直接LCT 考虑有环怎么办,如果是静态的话就tarjan了,但是这里要动态的缩环 具体是link操作的时候看一下是否成环(两点已联通),成环的话就用并查集把这条链缩到一个点,把权值加给祖先,断开所有splay上儿子。不过父亲这里不用管,就先让他们连着 每次操作的时候都用并查集找到支配点 阅读全文
posted @ 2019-04-18 20:24 lokiii 阅读(178) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2019-03-31 11:49 lokiii 阅读(5) 评论(0) 推荐(0)
摘要:用SA求出height数组,然后发现每个height值都有一个贡献区间(因为点对之间要依次取min) 用单调栈处理出区间,第一问就做完了 然后用并查集维护每个点的贡献(?),从大到小枚举height,因为这样区间是不断增大的所以并查集合并即可 cpp include include include 阅读全文
posted @ 2019-02-01 23:13 lokiii 阅读(118) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-10-10 22:02 lokiii 阅读(3) 评论(0) 推荐(0)
摘要:満身創痍 ゲームオーバー 阅读全文
posted @ 2018-09-28 15:47 lokiii 阅读(128) 评论(0) 推荐(0)
摘要:この夜よどうか明けないで 迷い道の晴れるまで 阅读全文
posted @ 2018-09-24 11:37 lokiii 阅读(88) 评论(0) 推荐(0)
摘要:等于有传递性,所以hash一下把等于用并查集连起来,然后再判断不等于是否合法即可 cpp include include include include using namespace std; const int N=200005; int T,n,x,y,v,f[N],g[N],tot,has; 阅读全文
posted @ 2018-09-15 08:09 lokiii 阅读(108) 评论(0) 推荐(0)
摘要:又犯了zz的错误…… 需要注意的是,被毁掉的星球是不算一个联通块的(可能只有我这么算吧= =) 离线下来时间倒流,就变成了向图里加星球,也就是用并查集维护联通,在用tot变量记录当前答案,每加一个星球就tot++,每合并一个联通块就tot 注意始终没有被毁掉的星球应该在时间倒流前就加进图里 阅读全文
posted @ 2018-08-01 23:34 lokiii 阅读(122) 评论(0) 推荐(0)
摘要:我是zz吗这么简单都写错…… 一眼二分,然后判断的话是枚举点,然后计算这个点到已有联通块的最小距离,如果这个点到一些联通块的距离小于当前二分的val,则把这些联通块合并起来,这里用并查集维护,最后看这样得出的部落数是否大于k(多出来的可以直接合并) 有个非常小的优化就是不用double二分,直接把点 阅读全文
posted @ 2018-07-30 00:11 lokiii 阅读(118) 评论(0) 推荐(0)
摘要:m是5000,就想到了直接枚举比例 具体做法是是先把边按照边权从小到大排序,然后先枚举最小边权,再枚举最大边权,就是从最小边权里一个一个加进并查集里,每次查st是否联通,联通则退出,更新答案 阅读全文
posted @ 2018-07-29 08:58 lokiii 阅读(160) 评论(0) 推荐(0)
摘要:传送:http://poj.openjudge.cn/practice/C18D/ 依然是课件截图 cpp include include include include include using namespace std; const int N=405,mod=1e9+7,inf=2e9; 阅读全文
posted @ 2018-07-19 22:24 lokiii 阅读(187) 评论(0) 推荐(0)
摘要:很有意思的题,~~所以还是截lyddalao的课件~~ cpp include include include using namespace std; const int N=6005; int T,n,f[N],s[N]; long long ans; struct qwe { int u,v, 阅读全文
posted @ 2018-07-18 17:26 lokiii 阅读(163) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-07-13 22:37 lokiii 阅读(2) 评论(0) 推荐(0)
摘要:二分答案,把边权小于mid的边的两端点都并起来,看最后是否只剩一个联通块 阅读全文
posted @ 2018-05-05 10:59 lokiii 阅读(109) 评论(0) 推荐(0)
摘要:参考:http://hzwer.com/4361.html 坐标开long long,inf开大点 先曼哈顿转切比雪夫(x+y,x y),距离就变成了max(x',y'); 先按x排序,维护两个指针,指针内区间的x差总是 include include include using namespace 阅读全文
posted @ 2018-05-05 09:07 lokiii 阅读(146) 评论(0) 推荐(0)
摘要:枚举从大到小s1,二分s2(越大越有可能符合),2 SAT判断,ans取min 思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分... 有个优化,就是当不是二分图的时候退出枚举,这个用并查集染色维护 cpp include include include inc 阅读全文
posted @ 2018-04-24 16:27 lokiii 阅读(328) 评论(0) 推荐(0)
摘要:参考:http://hzwer.com/6888.html 把k条道路权值设为0,和其他边一起跑MST,然后把此时选中的其他边设为必选,在新图中加上必选变缩成k个点,把所有边重标号,枚举k跳边的选取情况,和其他边做MST,建出树,k条边的权值在树上取min cpp include include i 阅读全文
posted @ 2018-04-18 10:38 lokiii 阅读(200) 评论(0) 推荐(0)
摘要:画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1;偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第一行的这一列已经被染色的情况)快速幂一下即可。 cpp include include includ 阅读全文
posted @ 2018-04-15 09:31 lokiii 阅读(231) 评论(0) 推荐(0)