BZOJ4668 冷战(并查集)
显然可以用LCT维护kruskal重构树。或者启发式合并维护kruskal重构树的倍增数组虽然多了个log也不一定比LCT慢吧。
当然这里的kruskal重构树几乎只是把树上的边权换成了点权,并不重要。
我们要查询的是树上两点间路径边权最大值。显然要并查集按秩合并一波。然后……并查集的树高就是log啊?维护个鬼的倍增数组啊直接暴力啊?
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 500010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,lastans,fa[N],len[N],deep[N];
bool flag[N];
int find(int x){return fa[x]==x?x:find(fa[x]);}
void merge(int x,int y,int i)
{
int p=find(x),q=find(y);
if (p!=q)
{
if (deep[p]<deep[q]) swap(p,q);
fa[q]=p;if (deep[p]==deep[q]) deep[p]++;
len[q]=i;
}
}
int query(int x,int y)
{
int p=find(x),q=find(y);
if (p!=q) return ;
int u=x;while (fa[u]!=u) flag[u]=,u=fa[u];flag[u]=;
int ans=;
while (!flag[y]) ans=max(ans,len[y]),y=fa[y];
u=x;while (u!=y) ans=max(ans,len[u]),flag[u]=,u=fa[u];
while (fa[u]!=u) flag[u]=,u=fa[u];flag[u]=;
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4668.in","r",stdin);
freopen("bzoj4668.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
for (int i=;i<=n;i++) fa[i]=i,deep[i]=;
int cnt=;
while (m--)
{
int op=read();
if (op==)
{
int x=read()^lastans,y=read()^lastans;
merge(x,y,++cnt);
}
else
{
int x=read()^lastans,y=read()^lastans;
printf("%d\n",lastans=query(x,y));
}
}
return ;
}
BZOJ4668 冷战(并查集)的更多相关文章
- BZOJ4668: 冷战 [并查集 按秩合并]
BZOJ4668: 冷战 题意: 给定 n 个点的图.动态的往图中加边,并且询问某两个点最早什 么时候联通,强制在线. 还可以这样乱搞 并查集按秩合并的好处: 深度不会超过\(O(\log n)\) ...
- bzoj4668: 冷战 并查集按秩合并
题目链接 bzoj4668: 冷战 题解 按秩合并并查集,每次增长都是小集合倍数的两倍以上,层数不超过logn 查询路径最大值 LCT同解 代码 #include<bits/stdc++.h&g ...
- [BZOJ4668]冷战(并查集)
比较自然的思路是,由于需要记录连通块合并时的信息,所以需要建出Kruskal重构树. 需要用LCT维护,支持加点和在线LCA操作. 不妨考虑在并查集合并的同时记录信息,pre[x]表示x与它的父亲相连 ...
- BZOJ4668: 冷战 (并查集 + LCA)
题意:动态给点连边 询问两个点之间最早是在第几个操作连起来的 题解:因为并查集按秩合并 秩最高是logn的 所以我们可以考虑把秩看作深度 跑LCA #include <bits/stdc++.h ...
- 【BZOJ4668】冷战 并查集
[BZOJ4668]冷战 Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺 ...
- 【BZOJ-4668】冷战 并查集 + 按秩合并 + 乱搞
4668: 冷战 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 37 Solved: 24[Submit][Status][Discuss] Des ...
- 【bzoj4668】冷战 并查集按秩合并+朴素LCA
题目描述 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争 ...
- BZOJ 4668: 冷战 并查集&&暴力LCA(雾)
利用并查集按秩合并,保存每个点合并的时间: 求时间时,就一直跳u=fa[u],并记录路径上时间的最大值,代表最后一次合并的时间 #include<cstdio> #include<i ...
- bzoj 4668 冷战——并查集结构
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4668 不路径压缩,维护并查集的树的结构,查询链上最大值.按秩合并就可以暴爬. #includ ...
- bzoj 4668 冷战 —— 并查集按秩合并
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4668 按秩合并维护并查集的树结构,然后暴力找路径上的最大边权即可. 代码如下: #inclu ...
随机推荐
- python运算符及优先级顺序
python语言是一门脚本语言,支持面向对象.面向过程编程,兼具编译性和解释性的动态语言,整理出学习过程中一些基本Python运算符和运算符的优先级顺序. 一.算术运算符 运算符 描述 + 加 - 两 ...
- 14.2 multiprocessing--多线程
本模块提供了多进程进行共同协同工作的功能.由于Python存在GIL锁,对于多线程来说,这只是部分代码可以使用多CPU的优势,对于想全部使用多CPU的性能,让每一个任务都充分地使用CPU,那么使用多进 ...
- YII2.0学习一 Advanced 模板安装
下载github上的完事安装包(本机环境使用Composer安装非常慢) https://github.com/yiisoft/yii2-app-advanced 解压到文件目录 wwwroot/sh ...
- Java学习笔记九:Java的循环跳转语句
Java的循环跳转语句 一:Java循环跳转语句之break: 生活中,我们经常会因为某些原因中断既定的任务安排.如在参加 10000 米长跑时,才跑了 500 米就由于体力不支,需要退出比赛.在 J ...
- Hash学习笔记
啊啊啊啊,这篇博客估计是我最早的边写边学的博客了,先忌一忌. 本文章借鉴与一本通提高篇,但因为是个人的学习笔记,因此写上原创. 目录 谁TM边写边学还写这玩意? 后面又加了 Hash Hash表 更多 ...
- System.Speech使用
使用微软语音库 使用微软语音库可以很快速的制作一个小应用,比如一个唐诗的朗诵工具.本示例也是使用微软语音库,制作了一个唐诗宋词朗诵的应用,仅供加深学习印象 首先是要引入System.Speech库 然 ...
- 「LibreOJ#516」DP 一般看规律
首先对于序列上一点,它对答案的贡献只有与它的前驱和后驱(前提颜色相同)构成的点对, 于是想到用set维护每个颜色,修改操作就是将2个set暴力合并(小的向大的合并),每次插入时更新答案即可 颜色数要离 ...
- 【转】mybatis调用mssql有输入输出参数那种..
吐槽下,百度的搜索能力真心垃圾(有可能是我没想好关键词的缘故吧..)... 谷歌中国程序员呼唤你... 这面这边文章是别人的,感觉不错,转过来. http://lohasle.iteye.com/bl ...
- python2.7入门---元组
这次我们来学习下python中的元组.首先,基础认知点是,Python的元组与列表类似,不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号.元组创建很简单,只需要在括号中添加元素, ...
- MUI:字符串和json数据的相互转换
JSON.parse()--字符串转换json.JSON.stringify()--json转换成字符串 如:收到Json对象:response,则: {"result":&quo ...