BZOJ 4668 LCT
思路:
这不是LCT裸题嘛23333
(好像并查集+按秩合并就可以搞了 我还是too young)
维护边权的话 就新加一个点 代表边 这个点想线段的两个端点连边就好了
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
int n,m,op,xx,yy,top,lastans,T;
int fa[N],ch[N][],q[N],maxx[N],rev[N],v[N],f[N];
bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
void push_up(int x){maxx[x]=max(v[x],max(maxx[ch[x][]],maxx[ch[x][]]));}
void push_down(int x){if(rev[x])rev[ch[x][]]^=,rev[ch[x][]]^=,rev[x]=,swap(ch[x][],ch[x][]);}
void rotate(int p){
int q=fa[p],y=fa[q],x=(ch[q][]==p);
ch[q][x]=ch[p][!x],fa[ch[q][x]]=q;
ch[p][!x]=q,fa[p]=y;
if(!isroot(q)){
if(ch[y][]==q)ch[y][]=p;
if(ch[y][]==q)ch[y][]=p;
}fa[q]=p,push_up(q);
}
void splay(int x){
q[++top]=x;
for(int i=x;!isroot(i);i=fa[i])q[++top]=fa[i];
while(top)push_down(q[top]),top--;
for(int y=fa[x];!isroot(x);rotate(x),y=fa[x])if(!isroot(y)){
if((ch[y][]==x)^(ch[fa[y]][]==y))rotate(x);
else rotate(y);
}push_up(x);
}
void access(int x){for(int t=;x;t=x,x=fa[x])splay(x),ch[x][]=t,push_up(x);}
void makeroot(int x){access(x),splay(x),rev[x]^=;}
void link(int x,int y){makeroot(x),fa[x]=y;}
void split(int x,int y){makeroot(x),access(y),splay(y);}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)f[i]=i;
for(int i=;i<=m;i++){
scanf("%d%d%d",&op,&xx,&yy);
xx^=lastans,yy^=lastans;
if(op){
int fx=find(xx),fy=find(yy);
if(fx!=fy)printf("%d\n",lastans=);
else split(xx,yy),printf("%d\n",lastans=maxx[yy]);
}
else{
T++;
int fx=find(xx),fy=find(yy);
if(fx!=fy){
f[fx]=fy,v[n+T]=maxx[n+T]=T;
link(xx,n+T),link(n+T,yy);
}
}
}
}
2017.6.9 Upd
这竟然是考试题 不会并查集做法GG了....
明明复杂度一样还要卡 这究竟是道德的沦丧还是人性的缺失。
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
int op,n,m,u,v,l,T,s[N],f[N],w[N],vis[N],ans[N],vv;
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)s[i]=;
while(m--){
scanf("%d%d%d",&op,&u,&v),u^=l,v^=l;
if(op){
vv++,ans[u]=w[u],ans[v]=w[v];bool flg=;
for(int lu=;u;lu=u,u=f[u])ans[u]=max(w[lu],ans[lu]),vis[u]=vv;
for(int lv=;v;lv=v,v=f[v])if(vis[v]==vv){
printf("%d\n",l=max(ans[v],max(w[lv],ans[lv])));flg=;break;
}else ans[v]=max(w[lv],ans[lv]);
if(flg)printf("%d\n",l=);
}else{
T++;while(f[u])u=f[u];while(f[v])v=f[v];if(u==v)continue;
if(s[u]<s[v])swap(u,v);s[u]+=s[v],f[v]=u,w[v]=T;
}
}
}
BZOJ 4668 LCT的更多相关文章
- [BZOJ 4668]冷战(带边权并查集+启发式合并)
[BZOJ 4668]冷战(并查集+启发式合并) 题面 一开始有n个点,动态加边,同时查询u,v最早什么时候联通.强制在线 分析 用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与 ...
- 【BZOJ 4668 冷战】
题目: [BZOJ 4668 冷战] 思路: 因为考虑强制在线,我们是肯定要维护形状的 我们发现如果\((u,v)\)这条边如果\(u,v\)已经连上,那么对于最终答案这条边是没有贡献的 所以我们发现 ...
- BZOJ 4668: 冷战 并查集启发式合并/LCT
挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲. 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性. #include <cstdio> #include < ...
- BZOJ 4668: 冷战
Description 在一个图上,在两个点间连一条边,问这两个点最早在什么时候联通. Sol 并查集+启发式合并. 按秩合并的并查集...我也不知道什么是按秩合并,反正就跟启发式合并差不多,合并的时 ...
- BZOJ 2002 && BZOJ 2409 LCT && BZOJ 3282 初步练习
#include <cstdio> ; inline void Get_Int(int & x) { ; ') ch=getchar(); +ch-'; ch=getchar(); ...
- bzoj 2002 LCT
LCT最基础的题,就用到了一个ACCESS操作 首先我们将这个绵羊弹飞的情况看成一颗树,那么假设X点被弹飞到 Y点,那么Y为X的父亲节点,弹飞的话父亲节点为n+1(虚设) 那么每个询问就是询问X点到根 ...
- bzoj 3669 lct维护最小生成树
大概题意:给一个无向图,有a,b两种边权,找一条从1到n的路径,使得max(a[i])+max(b[i])最小a[i],b[i]表示该路径上的边的对应权. 如果用类似最短路的DP来做,显然每个点的状态 ...
- 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文件读写及形式转化和CGI的简单应用
一丶python文件读写学习笔记 open() 将会返回一个 file 对象,基本语法格式如下: open(filename, mode) filename:包含了你要访问的文件名称的字符串值. mo ...
- 腾讯云:基于 Ubuntu 搭建 VNC 远程桌面服务
基于 Ubuntu 搭建 VNC 远程桌面服务 前言 任务时间:5min ~ 10min 必要知识 本教程假设您已学习以下 Ubuntu 基本操作: 连接 SSH 执行命令 编辑文件 如果还没有掌握 ...
- NT9666X调试log
1.给GSensor_open();前加上打印函数DEBUG_P;打印如下信息: ######## FILE = e:/Project_code/Philips_PanGu/Philips_PanGu ...
- springcloud(十三):Ribbon客户端负载均衡实例
一.采用默认的负载均衡策略:RoundRobinRule 轮询策略 1.修改提供者原的控制类 在之前的eureka-client-provider项目的CenterController.java中加入 ...
- 升级 HTTPS,价值何在?
HTTPS 实质上是一种面向安全信息通信的协议.从最终的数据解析的角度上看,HTTPS 与 HTTP 没有本质上的区别.对于接收端而言,SSL/TSL 将接收的数据包解密,将数据传给 HTTP 协议层 ...
- 【Codeforces 369C】 Valera and Elections
[链接] 我是链接,点我呀:) [题意] 给你一棵树 让你选择若干个修理点. 这些修理点被选中之后,节点i到1号节点之间的所有"坏路"都会被修好 问最少需要选择多少个点才能将所有的 ...
- java中List遍历删除元素-----不能直接 list.remove()
https://blog.csdn.net/github_2011/article/details/54927531 这是List接口中的方法,List集合调用此方法可以得到一个迭代器对象(Itera ...
- FLASH BACK
overview of different flashback technologies flashback query(including flashback query, flashback ve ...
- SpriteBuilder&Cocos2D使用CCEffect特效实现天黑天亮过度效果
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 在动作或RPG类游戏中我们有时须要天黑和天亮过度的效果来完毕场 ...
- 黑马程序猿——JAVA基础——IO流
----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一. 一.IO流的三种分类方式 1.按流的方向分为:输入流和输出流 2.按流的数 ...