并查集
HT008_123
家人们点点关注叭
展开
-
[ICPC2019 南昌站] Bob's Problem
题目描述: 有N个点,M条边 边有权值和颜色(黑色 白色) 最多选K条白边,黑色边数量不限,问在保证选出的边让图联通的情况下,边取值和最大 题目分析: 由于黑色边没有限制数量 我们可以先把所有的黑色边扔进去,做克鲁斯卡尔 然后把白边按照权值降序排列 第一次我们先尽量保证图联通,因此当边链接的点不在一个连通块的时候取这条边。记录当前用白边的数量 然后判断能否用少于等于K让图联通 如果白边还有剩余,我...原创 2019-12-08 23:46:09 · 212 阅读 · 0 评论 -
2019牛客暑期多校训练营(第九场)E All men are brothers
题目描述: 有N个人M个操作,每次操作让两个人互相认识,认识关系可以互相传递,求每次操作完毕后,选4个互相不认识的人的方案数 题目分析: 并查集维护联通块内的人数 刚开始答案一定是 C(N,4) 我们定义一个数量Pre为目前选两个互相不认识的人的方案数 初始值为C(N,2) 每次合并两个联通块,如果两个人本来就在一个联通块里是不需要改变答案的。 如果没有在一个联通块内,我们考虑如何通过上次的答案求...原创 2019-08-15 21:01:08 · 177 阅读 · 0 评论 -
[HEOI2016/TJOI2016]树
题目描述: 给出一棵树 有M个操作 C U 表示给 U节点打标记 Q U 表示询问 距离 U节点最近的标记节点(包括本身 初始时只有1节点有标记 一个点可以重复多次打标记 题目分析: 一开始傻敷敷的打了个树剖+线段树 然而题目并没有强制要求在线搞… 我们把所有操作读进来 cnt[i]表示i节点目前标记数目 我们先遍历树,搞出父子关系 然后用并查集 如果一个点 cn...原创 2018-03-18 20:20:40 · 203 阅读 · 0 评论 -
[SCOI 2016] 萌萌哒
题目描述: 语死早. 题目分析: 如果没有限制 那么答案就是 9∗10n−19∗10n−19*10^{n-1} 现在加入了限制 l1-r1 == l2-r2 可以发现相等的两个区间中互相对应的位置是联系在一起的,也就是说,确定了一个就可以确定另外一个。所以可以考虑把这样的点合并起来。 用并查集维护合并关系 重复的合并过多,利用倍增进行合并 f[i][j] 表示 [i−>2...原创 2018-03-11 09:13:07 · 171 阅读 · 0 评论 -
[NOI 2015]程序自动分析
我觉得是NOI史上最简单的题目了,没有之一。 题目分析: 我们把相等的变量合并起来,然后最后在扫一遍不同的变量是否在一个块里。 可能变量很大,离散化一下。 题目链接: UOJ Luogu BZOJ COGS Ac Code: #include #include #include using namespace std; const int maxm=1e7+1原创 2018-01-24 09:00:32 · 218 阅读 · 0 评论 -
Tarjan求LCA
我对Tarjan越来越崇拜了! 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点。 换句话说,就是两个点在这棵树上距离最近的公共祖先节点。 所以LCA主要是用来处理当两个点仅有唯一一条确定的最短路径时的路径。 有人可能会问:那他本身或者其父亲节点是否可以作为祖先节点呢原创 2017-10-16 15:26:47 · 349 阅读 · 0 评论 -
数列+车辆销售
这就是更相减损之术。 直接模拟太慢。 搞成辗转相除。 对于a,b不一样的数的个数为a/b 然后按求GCD的方法递归下去#include <cstdio> #include <iostream> #include <cstring> #define ll long long using namespace std; ll ans=0; ll abs(ll x) { if(x<0原创 2017-11-02 16:48:27 · 233 阅读 · 0 评论 -
History
3.1 题目描述 历史学家小A正在研究一个奇怪的王国的历史。当前阶段的任务是研究该国的交通。 根据这个奇怪的王国的史书记载,史书开始记载前这个王国有 n 个城市(城市从 0 开 始标号),但所有城市之间都没有道路相连。 每一年,在位的国王会修建一条 x 到 y 的双向道路,一条道路可能被修建多次,但不会 修建起点和终点为同一个城市的道路。 而在这之间,国王会计划进行若干次旅行。对于计划进行的一次旅行原创 2017-09-06 17:59:35 · 365 阅读 · 0 评论 -
P1111 修复公路
传送门 按时间排序,判断联通块的个数即可原创 2017-08-21 17:46:21 · 395 阅读 · 0 评论 -
P3144 [USACO16OPEN]关闭农场Closing the Farm
QAQ 我们删边为加边,倒着加边,然后暴力判断,只要祖宗>1,就说明不连通#include <cstdio> #include <iostream> using namespace std; int fat[999999]; int map[3099][3099]; int w[99999]; bool ans[99999]; int find(int x) { if(x==fat[x])原创 2017-08-04 16:17:57 · 293 阅读 · 0 评论 -
堡垒
算个并查集吧,同一个房间一定会有一个祖宗 然后去枚举断墙,找出最大值 注意最后找墙的时候倒着循环 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int m,n; int fat[5000],num[5000]; int find(int x) { if(x!=fat原创 2017-07-26 11:14:25 · 230 阅读 · 0 评论 -
P1197 [JSOI2008]星球大战
QAQ 一道大水题,跟之前做过的一道题跟这道题很像。 我们倒着加入删除的节点就可以统计联通块的个数了。 统计方法,先把删除了所有的删除节点的联通块记录一下,tot表示当前图中连通块的数量 每次加入点时,先将这个点视为一个单独的块,然后把它的邻接点往这个点上并,如果它的邻接点的根节点不是当前节点,证明删除了一个联通块,tot–就可以了 O(nlogn)#include <iostream>原创 2017-08-10 08:50:21 · 356 阅读 · 0 评论 -
4246 奶牛的身高
裸的带权并查集 如果输入的两者不知道关系,就新建关系 如果两者知道关系,看看两者的关系是否与输入一致就AC辣 坑点 Bessie’s eyes are good Bessie is blind. 这才是输出,不要相信样例啊!#include <cstdio> #include <iostream> #include <cstring> using namespace std; int原创 2017-08-09 17:03:21 · 346 阅读 · 0 评论