[BZOJ 4668]冷战(带边权并查集+启发式合并)
[BZOJ 4668]冷战(并查集+启发式合并)
题面
一开始有n个点,动态加边,同时查询u,v最早什么时候联通。强制在线
分析
用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与父亲相连。查询u,v的时候显然可以看出,答案就是u到v路径上的点tim的最大值。所以像求lca一样暴力向上跳就可以了。然后按秩合并,树高是\(O(\log n)\)的,所以每次查询是\(O(\log n)\)的
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 500000
using namespace std;
int n,m;
struct disjoint_set{
int fa[maxn+5];
int tim[maxn+5];//记录x什么时间与父亲相连
int sz[maxn+5];
int find(int x){
while(fa[x]!=0) x=fa[x];
return x;
}
int get_deep(int x){
int ans=0;
while(fa[x]!=0){
ans++;
x=fa[x];
}
return ans;
}
void merge(int x,int y,int t){
int fx=find(x),fy=find(y);
if(fx!=fy){
if(sz[fx]>sz[fy]) swap(fx,fy);
fa[fx]=fy;
tim[fx]=t;
sz[fy]+=sz[fx];
}
}
int query(int x,int y){//其实是跳到lca
int ans=0;
if(find(x)==find(y)){
int dx=get_deep(x),dy=get_deep(y);
if(dx<dy){
swap(x,y);
swap(dx,dy);
}
while(dx>dy){
ans=max(ans,tim[x]);
x=fa[x];
dx--;
}
if(x==y) return ans;
while(x!=y){
ans=max(ans,max(tim[x],tim[y]));
x=fa[x];
y=fa[y];
}
return ans;
}else return 0;
}
void ini(int n){
for(int i=1;i<=n;i++){
fa[i]=0;
sz[i]=1;
}
}
}S;
int main(){
int u,v,cmd;
int last=0;
scanf("%d %d",&n,&m);
int tim=0;
S.ini(n);
for(int i=1;i<=m;i++){
scanf("%d %d %d",&cmd,&u,&v);
u^=last;
v^=last;
if(cmd==0) S.merge(u,v,++tim);
else{
last=S.query(u,v);
printf("%d\n",last);
}
}
}
/*
5 9
0 2 5
1 2 5
*/
[BZOJ 4668]冷战(带边权并查集+启发式合并)的更多相关文章
- [HDU 3712] Fiolki (带边权并查集+启发式合并)
[HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- BZOJ 4668: 冷战 并查集启发式合并/LCT
挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲. 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性. #include <cstdio> #include < ...
- AcWing:240. 食物链(扩展域并查集 or 带边权并查集)
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形. A吃B, B吃C,C吃A. 现有N个动物,以1-N编号. 每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用 ...
- BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- POJ-1733 Parity game(带权并查集区间合并)
http://poj.org/problem?id=1733 题目描述 你和你的朋友玩一个游戏.你的朋友写下来一连串的0或者1.你选择一个连续的子序列然后问他,这个子序列包含1的个数是奇数还是偶数.你 ...
- HDU-3038 How Many Answers Are Wrong(带权并查集区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3038 大致题意: 有一个区间[0,n],然后会给出你m个区间和,每次给出a,b,v,表示区间[a,b]的区间和为 ...
- [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
- BZOJ 3673: 可持久化并查集(可持久化并查集+启发式合并)
http://www.lydsy.com/JudgeOnline/problem.php?id=3673 题意: 思路: 可持久化数组可以用可持久化线段树来实现,并查集的查询操作和原来的一般并查集操作 ...
随机推荐
- 解析binlog生成MySQL回滚脚本
如果数据库误操作想恢复数据.可以试试下面这个脚本.前提是执行DML操作. #!/bin/env python #coding:utf-8 #Author: Hogan #Descript : 解析bi ...
- BZOJ 5028 小z的加油站
bzoj链接 Time limit 10000 ms Memory limit 262144 kB OS Linux 感想 树上动态gcd的第二题也好了. [x] BZOJ 2257 [JSOI200 ...
- HDU3465--Life is a Line(树状数组求逆序数,离散化)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submission(s ...
- sqli-labs(31)
0x01找闭合 这里是WAF的jsp调到php的同样 第二个参数构造 偷看源码 闭合是") 我们尝试一下构造爆破数据库名 login.php?id=&id=-") unio ...
- JavaScript 文件拖拽上传插件 dropzone.js 介绍
http://www.renfei.org/blog/dropzone-js-introduction.html
- linux系统下自动删除前N天的日志文件
删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: find /opt/soft/log/ -mti ...
- Git-Runoob:Git 基本操作
ylbtech-Git-Runoob:Git 基本操作 1.返回顶部 1. Git 基本操作 Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比.本章将对有关创建与提交你的项目快照的命令作 ...
- 阶段3 1.Mybatis_10.JNDI扩展知识_2 补充-JNDI搭建maven的war工程
使用骨架 src下创建test目录 再新建java和resources两个Directory test下面创建java java的目录,让他作为源码的跟目录 test下的java文件夹 选择 完成之后 ...
- 阶段3 1.Mybatis_04.自定义Mybatis框架基于注解开发_3 基于注解的自定义再分析
这里只需要 一是连接数据库的 二是映射的 注解是class的方式 dom4j技术获取xml的数据,这是xml的方式获取的下面几个关键的点 注解的方式回去dao类里面的几个主要的信息 User黄色的部 ...
- fiddler之数据分析和查看(inspectors)-抓包
在instpectors中主要是对请求和响应进行查看和分享,监听请求的响应内容.他有多个分页标签.界面分上下两部分,上面部分显示请求的相关信息:下面部分显示响应相关信息.简单说明常用的几个分页标签 一 ...