比较自然的思路是,由于需要记录连通块合并时的信息,所以需要建出Kruskal重构树。

需要用LCT维护,支持加点和在线LCA操作。

不妨考虑在并查集合并的同时记录信息,pre[x]表示x与它的父亲相连的时刻。

两个点连通的时刻,等于两个点之间路径上时刻的最大值。

注意到按秩合并但不路径压缩的并查集不改变树的结构,且树高为log,正好符合要求。

$O(n\log n)$

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int n,m,op,u,v,ans,tim,he[N],fa[N],pre[N]; int find(int x){ return (fa[x]==x) ? x : find(fa[x]); } void uni(int u,int v,int tim){
u=find(u); v=find(v);
if (u==v) return;
if (he[u]<he[v]) swap(u,v);
fa[v]=u; pre[v]=tim;
if (he[u]==he[v]) he[u]++;
} int lca(int u,int v){
if (find(u)!=find(v)) return ;
int s1=,s2=,x=u,y=v,res=;
while (x!=fa[x]) s1++,x=fa[x];
while (y!=fa[y]) s2++,y=fa[y];
while (s1>s2) res=max(res,pre[u]),u=fa[u],s1--;
while (s2>s1) res=max(res,pre[v]),v=fa[v],s2--;
while (u!=v) res=max(res,max(pre[u],pre[v])),u=fa[u],v=fa[v];
return res;
} int main(){
freopen("bzoj4668.in","r",stdin);
freopen("bzoj4668.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,n) fa[i]=i,he[i]=;
rep(i,,m){
scanf("%d%d%d",&op,&u,&v); u^=ans; v^=ans;
if (op==) uni(u,v,++tim); else printf("%d\n",ans=lca(u,v));
}
return ;
}

[BZOJ4668]冷战(并查集)的更多相关文章

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

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

  2. bzoj4668: 冷战 并查集按秩合并

    题目链接 bzoj4668: 冷战 题解 按秩合并并查集,每次增长都是小集合倍数的两倍以上,层数不超过logn 查询路径最大值 LCT同解 代码 #include<bits/stdc++.h&g ...

  3. BZOJ4668: 冷战 (并查集 + LCA)

    题意:动态给点连边 询问两个点之间最早是在第几个操作连起来的 题解:因为并查集按秩合并 秩最高是logn的 所以我们可以考虑把秩看作深度 跑LCA #include <bits/stdc++.h ...

  4. 【BZOJ4668】冷战 并查集

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

  5. 【BZOJ-4668】冷战 并查集 + 按秩合并 + 乱搞

    4668: 冷战 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 37  Solved: 24[Submit][Status][Discuss] Des ...

  6. 【bzoj4668】冷战 并查集按秩合并+朴素LCA

    题目描述 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争 ...

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

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

  8. bzoj 4668 冷战——并查集结构

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4668 不路径压缩,维护并查集的树的结构,查询链上最大值.按秩合并就可以暴爬. #includ ...

  9. bzoj 4668 冷战 —— 并查集按秩合并

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4668 按秩合并维护并查集的树结构,然后暴力找路径上的最大边权即可. 代码如下: #inclu ...

随机推荐

  1. 十大opengl教程

    正文: 1. http://nehe.gamedev.net/ 这个是我觉得全世界最着名的OpenGL教程,并且有网友将其中48个教程翻译成了中文http://www.owlei.com/Dancin ...

  2. 关于new Handler()与new Handler(Looper.getMainLooper())区别

    如果你不带参数的实例化:Handler handler=new Handler();那么这个会默认用当前线程的Looper对象. 一般而言,如果你的Handler是要用来刷新UI的,那么就需要在主线程 ...

  3. bzoj 1014: 洛谷 P4036: [JSOI2008]火星人

    题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...

  4. 查看linux服务器内存信息

    查看服务器内存信息 dmidecode|grep -P -A5 "Memory\s+Device"|grep Size [root@localhost home]# dmideco ...

  5. Microsoft.AspNet.SignalR使用cookie丢失

    public void SendGroupMessage(string roomId, string message, string status) { // 调用房间内所有客户端的sendMessa ...

  6. java 一个函数如何返回多个值

    在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过 ...

  7. centos7 yum搭建lamp环境

    =============================================== 2018/1/14_第1次修改                       ccb_warlock == ...

  8. 试用Redis

    Windows 10家庭中文版,运行于VirtualBox上的Ubuntu 18.04,Redis 4.0.10, Redis,久仰大名!因为没有从事互联网行业,所以一直没有使用过.近期找工作,也隐约 ...

  9. C# Guid 16位 唯一

    public static class GuidExtentions { /// <summary> /// 根据GUID获取16位的唯一字符串 /// </summary> ...

  10. 关于整型Integer、Int32、Int64、IntPtr、UINT、UInt32、Cardinal、UInt64、UIntPtr、NativeUInt、Pointer、Handle

    知识点1:UIntPtr = NativeUInt = Pointer = Handle 随程序的位数改变而改变.如下: 所以以后再用指针的时候要这样:UintPtr/NativeUInt(实例) = ...