并查集+启发式合并+LCA思想 || 冷战 || BZOJ 4668
题面:bzoj炸了,以后再补发
题解:
并查集,然后对于每个点记录它与父亲节点联通的时刻 tim ,答案显然是 u 到 v 的路径上最大的 tim 值。启发式合并,把 size 小的子树往大的上并,可以证明树高是 log N 的(我不会),
所以最后套一个LCA思想,直接向上跳着找出路径上最大的 tim 值即为答案,时间复杂度O(N log N)。
代码:
#include<cstdio>
#include<iostream>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
inline int rd(){
int x=;char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x;
}
const int maxn=5e5+,maxm=5e5+;
int N,M,o,u,v,ans=,fa[maxn],tim[maxn],now=,f1,f2,siz[maxn];
int now_tim=;
inline int getf(int n){
if(fa[n]==n) return n;
return getf(fa[n]);
}
inline int getdep(int n){
int cnt=;
while(fa[n]!=n){
cnt++;
n=fa[n];
}
return cnt;
}
int main(){
N=rd(); M=rd();
for(int i=;i<=N;i++) fa[i]=i,siz[i]=;
while(M--){
o=rd(); u=rd(); v=rd();
u=u^ans; v=v^ans;
if(o==){
now_tim++;
f1=getf(u); f2=getf(v);
if(f1!=f2){
if(siz[f1]>siz[f2]) swap(f1,f2);
siz[f2]+=siz[f1];
fa[f1]=f2;
tim[f1]=now_tim;
}
}
else{
f1=getf(u); f2=getf(v);
ans=;
if(f1!=f2) {
printf("%d\n",ans);
continue;
}
int dep1=getdep(u),dep2=getdep(v);
if(dep1<dep2) swap(dep1,dep2),swap(u,v);
while(dep1>dep2){
dep1--;
ans=max(ans,tim[u]);
u=fa[u];
}
if(u!=v){
while(fa[u]!=fa[v]){
ans=max(ans,tim[u]);
ans=max(ans,tim[v]);
u=fa[u]; v=fa[v];
}
ans=max(ans,tim[u]);
ans=max(ans,tim[v]);
}
printf("%d\n",ans);
}
}
return ;
}
By:AlenaNuna
并查集+启发式合并+LCA思想 || 冷战 || BZOJ 4668的更多相关文章
- [BZOJ 4668]冷战(带边权并查集+启发式合并)
[BZOJ 4668]冷战(并查集+启发式合并) 题面 一开始有n个点,动态加边,同时查询u,v最早什么时候联通.强制在线 分析 用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与 ...
- BZOJ 4668: 冷战 并查集启发式合并/LCT
挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲. 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性. #include <cstdio> #include < ...
- [HDU 3712] Fiolki (带边权并查集+启发式合并)
[HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...
- BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- BZOJ 3673: 可持久化并查集(可持久化并查集+启发式合并)
http://www.lydsy.com/JudgeOnline/problem.php?id=3673 题意: 思路: 可持久化数组可以用可持久化线段树来实现,并查集的查询操作和原来的一般并查集操作 ...
- Codeforces 1166F 并查集 启发式合并
题意:给你一张无向图,无向图中每条边有颜色.有两种操作,一种是询问从x到y是否有双彩虹路,一种是在x到y之间添加一条颜色为z的边.双彩虹路是指:如果给这条路径的点编号,那么第i个点和第i - 1个点相 ...
- [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- 2018.08.21 bzoj4668: 冷战(并查集+启发式合并)
传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按si ...
- 51Nod 1515 明辨是非 —— 并查集 + 启发式合并
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 1515 明辨是非 题目来源: 原创 基准时间限制:1 ...
随机推荐
- Day3 && Day4
本章内容对我来说真的是学的稀里糊涂的,除了前两题吭哧吭哧独立完成,第三题参考了别人的思路外,其余题目均是现学现卖,有点迷啊.所以写这篇博客的目的是先记录下聚聚们对本章内容相关重点的要求,并搜集一些相关 ...
- DESC加密解密算法
using System; using System.Text; using System.Windows.Forms; using System.Security.Cryptography; usi ...
- 06 vue router(一)
一.vue route是什么? Vue Router是vue.js官方的路由管理器.主要有以下几种功能 1.路由和视图表的配置.(已明白) 2.模块化和基于组件的路由配置.(已明白) 3.路由参数.查 ...
- (C#)Appium自动化测试之mobile:shell输入法
1.ADB执行Shell命令 a.如果电脑上已装Appium,那么需要在高级设置里勾选 Relaxed Security. 如图: b.cmd命令行启动appium appium --rela ...
- NJCTF (easycrack)
安装app查看.一个输入框,输入随便输入显示Try again. 放入JEB反编译. 关于输入框监听是第一次见,具体可以看看这个博客https://www.jianshu.com/p/f976c677 ...
- 【AMAD】django-model-utils -- Django model使用的mixin和utils
动机 简介 个人评分 动机 为django model系统提供一些可重用的mixin和utils. 简介 django-model-utils1为Django Model提供了下嘛几种分类的utils ...
- 5分钟学会maven入门
一.背景 1.定位:Maven是优秀的构建工具 2.意义:自动化构建,即节约了我们每天有相当一部分时间花在编 译.运行单元测试.生成文档.打包和部署等烦琐且不起眼的时间. 3.三要素:目标(Targe ...
- 解决anaconda安装cvxpy失败的方法
在Windows下安装凸优化包CVXPY 直接在anaconda prompt中输入pip install cvxpy经常会出现安装失败的情况,使用以下方法,亲测成功! 1. 下载所需的whl文件,请 ...
- luoguP3390(矩阵快速幂模板题)
链接:https://www.luogu.org/problemnew/show/P3390 题意:矩阵快速幂模板题,思路和快速幂一致,只需提供矩阵的乘法即可. AC代码: #include<c ...
- 关于8086中的jmp near ptr原理
在8086汇编语言中.jmp 0x7c41 自己跳转到自己的位置,是一个死循环代码.对应的机器指令是e9fdffe9是跳转 fdff其实应该是fffd 也就是-3的补码. 执行到e9fdff相当于把 ...