Description
1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕。美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争。在这段时期,虽然分歧和冲突严重,但双方都尽力避免世界范围的大规模战争(第三次世界大战)爆发,其对抗通常通过局部代理战争、科技和军备竞赛、太空竞争、外交竞争等“冷”方式进行,即“相互遏制,不动武力”,因此称之为“冷战”。
Reddington 是美国的海军上将。由于战争局势十分紧张,因此他需要时刻关注着苏联的各个活动,避免使自己的国家陷入困境。苏联在全球拥有 N 个军工厂,但由于规划不当,一开始这些军工厂之间是不存在铁路的,为了使武器制造更快,苏联决定修建若干条道路使得某些军工厂联通。
Reddington 得到了苏联的修建日程表,并且他需要时刻关注着某两个军工厂是否联通,以及最早在修建哪条道路时会联通。具体而言,现在总共有M 个操作,操作分为两类:
• 0 u v,这次操作苏联会修建一条连接 u 号军工厂及 v 号军工厂的铁路,注意铁路都是双向的;
• 1 u v, Reddington 需要知道 u 号军工厂及 v 号军工厂最早在加入第几条条铁路后会联通,假如到这次操作都没有联通,则输出 0;
作为美国最强科学家, Reddington 需要你帮忙设计一个程序,能满足他的要求。
Input
第一行两个整数 N, M。
接下来 M 行,每行为 0 u v 或 1 u v 的形式。
数据是经过加密的,对于每次加边或询问,真正的 u, v 都等于读入的u, v 异或上上一次询问的答案。一开始这个值为 0。
1 ≤ N, M ≤ 500000,解密后的 u, v 满足1 ≤ u, v ≤ N, u不等于v
Output
对于每次 1 操作,输出 u, v 最早在加入哪条边后会联通,若到这个操作时还没联通,则输出 0。
Sample Input
5 9
0 1 4
1 2 5
0 2 4
0 3 4
1 3 1
0 7 0
0 6 1
0 1 6
1 2 6
Sample Output
0
3
5

看到“联通”两字,一般人都应该可以想到并查集。

因为看到最早加入的边,所以可以在并查集合并的同时记录一个铁路条数,但是这样并查集合并的时候肯定要遍历整个并查集,那怎样将时间复杂度降低呢?

可以按秩合并,这样就能保证一次操作是O(logn)O(logn)O(logn)(但是就是不能路径压缩),我们可以在合并的同时,记录一个这是修建了第几条铁路。

那么怎么查询呢?

保证了一次操作是O(logn)O(logn)O(logn)的,所以可以直接暴力从两个点向上跳lca,第一个点一直跳到根,路径打上标记,第二个点在向上跳,直到遇到打标记的点,沿路记录铁路修建的最大值,最后记得清零。

#include<bits/stdc++.h>
#define N 500010
using namespace std;
struct data
{int fa,deep,id;
}a[N];
int n,m,op,x,y,cnt,lastans;
bool vis[N];
int getfa(int x)
{while(a[x].fa!=x){x=a[x].fa;}return x;
}
int query(int x,int y)
{int x2=x,y2=y,ans=0;while(a[x2].fa!=x2)//一号点先跳{vis[x2]=1;x2=a[x2].fa;}vis[x2]=1;while(!vis[y2]&&a[y2].fa!=y2)//跳二号点{y2=a[y2].fa;}x2=x;if(!vis[y2])//无交点{while(a[x2].fa!=x2){vis[x2]=0;x2=a[x2].fa;}vis[x2]=0;return 0;}while(a[x2].fa!=x2){vis[x2]=0;x2=a[x2].fa;}vis[x2]=0;//y2是lcawhile(x!=y2)//统计答案{ans=max(ans,a[x].id);x=a[x].fa;}while(y!=y2){ans=max(ans,a[y].id);y=a[y].fa;}return ans;
}
int main()
{//  freopen("1.txt","r",stdin);scanf("%d%d",&n,&m);for(int i=0;i<=n;i++){a[i].fa=i;a[i].deep=1;}for(int i=1;i<=m;i++){scanf("%d%d%d",&op,&x,&y);x^=lastans;y^=lastans;if(op==0){int xx=getfa(x),yy=getfa(y);cnt++;if(a[xx].fa!=a[yy].fa){if(a[xx].deep>a[yy].deep){swap(xx,yy);}a[xx].fa=yy;a[xx].id=cnt;if(a[xx].deep==a[yy].deep){a[yy].deep++;}}}else{printf("%d\n",lastans=query(x,y));}}return 0;
}

【BZOJ4668】冷战(并查集)相关推荐

  1. BZOJ4668: 冷战 [并查集 按秩合并]

    BZOJ4668: 冷战 题意: 给定 n 个点的图.动态的往图中加边,并且询问某两个点最早什 么时候联通,强制在线. 还可以这样乱搞 并查集按秩合并的好处: 深度不会超过\(O(\log n)\) ...

  2. 【BZOJ4668】冷战 并查集

    [BZOJ4668]冷战 Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表"铁幕演说",正式拉开了冷战序幕. 美国和苏联同为世界上的& ...

  3. BZOJ 4668 冷战——并查集+LCA

    基情链接♂BZOJ 1977 严格次小生成树--浅析最近公共祖先(LCA) 目录 一.题目:冷战 1.题目描述 2.输入 3.输出 4.样例输入 5.样例输出 二.题解 三.代码 ​ 谢谢! 一.题目 ...

  4. BZOJ 4668: 冷战 并查集暴力LCA(雾)

    利用并查集按秩合并,保存每个点合并的时间: 求时间时,就一直跳u=fa[u],并记录路径上时间的最大值,代表最后一次合并的时间 #include<cstdio> #include<i ...

  5. BZOJ 4668: 冷战 并查集

    Time Limit: 10 Sec Memory Limit: 256 MB Submit: 440 Solved: 215 Description 1946 年 3 月 5 日,英国前首相温斯顿· ...

  6. 20211229[按秩合并并查集 最小生成树][BZOJ4668]冷战

    20211229[按秩合并并查集.最小生成树][BZOJ4668]冷战 题意:给定N点,动态加边与询问两点最早是哪条边开始连通,强制在线 首先如果离线的话可以直接跑最小生成树,不过代码不好处理. 当然 ...

  7. 2018.08.21 bzoj4668: 冷战(并查集+启发式合并)

    传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按si ...

  8. BZOJ 4668 冷战(按秩合并并查集+LCA)

    4668: 冷战 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 627  Solved: 303 [Submit][Status][Discuss] ...

  9. bzoj4668 冷战

    冷战 Time Limit: 10 Sec Memory Limit: 256 MB Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表"铁 幕演 ...

最新文章

  1. nodejs 转换long到unsigned long(NXT)
  2. vc++ 6.0 创建程序快捷方式的一个例子源码_漏洞复现:phpcms v9.6.0任意文件上传漏洞(CVE201814399)...
  3. P4111 [HEOI2015]小Z的房间
  4. AWS上的应用程序自动扩展–选项及其对性能的影响
  5. 个人网站的搭建(基于GitHub和Jekyll主题 )
  6. SpringBoot配置swagger2(亲测有效,如果没有配置成功,欢迎在下方留言)
  7. 洛谷 P1896 状压DP
  8. C语言华氏度转换摄氏度
  9. selenium自动化图片不加载设置
  10. 计算几何入门 1.3:凸包的构造——增量构造法
  11. *oulapp的双向证书破解
  12. Android延时执行事件的方法
  13. 自动驾驶公司Torc与NXP达成合作,研发雷达系统感知技术
  14. 苹果库乐队怎么玩_手机版决战万圣夜游戏下载了怎么玩?(安卓/苹果)
  15. 第一台计算机采取了哪位科学家的意见,计算机一级ms office考试上机题
  16. 探讨网站推广方式之论坛推广 [
  17. 先睹为快 | 卓越示范中心 ETB003 云原生安全实验测试床
  18. react快速框架dva搭建项目架构
  19. 多家大企业受GoAnywhere 0day 漏洞攻击影响
  20. 程序员面试谈薪资的6大技巧(转)

热门文章

  1. UWB定位,新一代的精确定位技术
  2. 远程访问云服务器CentOS下 jupyter服务 【保姆级教程】
  3. 非功能测试之兼容性测试、文档测试和安装测试
  4. 基于FPGA的数据采集系统
  5. TransOMCS:从语言图提取常识知识
  6. Maven - 8、大型Maven项目,快速按需任意构建
  7. 【读书笔记】《贫穷的本质》- [印度] Abhijit Banerjee / [法] Esther Duflo
  8. 2017. 圆周排列
  9. c语言对孩子的作用,爸爸用C语言给孩子早教,孩子逐渐崩溃,网友:你别害孩子秃顶...
  10. value.charAt(i)和value.slice(i)的理解