来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记
$
$
这应该算是道套路题吧, 如果将图中的边转换成点, 再将边权变点权, 就可以用 \(LCT\) 来维护了
这道题的基本做法就是, 用 \(LCT\) 来动态地维护最小生成树,
如果这样做的话, 题目中要求的删边操作就不太好搞,
但是既然只有删边操作的话, 我们就可以考虑离线处理,
将不会被删除的边先加进图中跑 \(Kruskal\) , 然后化删边为添边, 倒着来处理每一组询问.
$
$
此外, 用 \(LCT\) 维护 \(MST\) , 就是在添边的时候如果遇到环且环上最长的边边权大于当前边, 就将最大边 \(cut\) , 再将当前边添入

//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define N (100010)
#define M (1000010)
#define RG register
using namespace std;
inline int gi(){ RG int x=0; RG char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar();while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return x; }int n,m,q;
struct Edge{ int u,v,w; bool operator<(const Edge&a)const{ return u==a.u?v<a.v:u<a.u; }bool operator<(const pair<int,int>& a)const{return u==a.first?v<a.second:u<a.first;}
}e[M];struct Que{ int op,x,y; }Q[N];//-----------------------------------------------------------
int Fa[N];
inline int Find(RG int x){ return Fa[x]==x?x:Fa[x]=Find(Fa[x]); }struct EEE{int u,v,w,id;bool operator<(const EEE& a)const{ return w<a.w; }void operator=(const Edge& a){u=a.u,v=a.v,w=a.w,id=(&a)-e;}
}E[M];int num,head[N],nxt[N<<1],to[N<<1],w[N<<1]; //w为该边原来的编号
inline void add(int u,int v,int d){nxt[++num]=head[u];to[num]=v;w[num]=d;head[u]=num;nxt[++num]=head[v];to[num]=u;w[num]=d;head[v]=num;
}bool v[M];
inline void kruskal(){RG int top=0;for(RG int i=1;i<=n;i++) Fa[i]=i;for(RG int i=1;i<=m;i++){if(v[i]) continue;E[++top]=e[i];}sort(E+1,E+top+1);for(RG int i=1;i<=top;i++){RG int x=E[i].u,y=E[i].v;RG int fx=Find(x),fy=Find(y);if(fx==fy) continue;Fa[fx]=fy; add(x,y,E[i].id);}
}inline void init(){n=gi(),m=gi(),q=gi();for(RG int i=1;i<=m;i++){e[i].u=gi(),e[i].v=gi(),e[i].w=gi();}sort(e+1,e+m+1);for(RG int i=1;i<=q;i++){Q[i].op=gi(),Q[i].x=gi(),Q[i].y=gi();if(Q[i].op==2){RG int V=lower_bound(e+1,e+m+1,make_pair(Q[i].x,Q[i].y))-e;Q[i].x=V; v[V]=1;}}q++;kruskal();
}
//---------------------------------------------------------------int val[N+M],Max[N+M];
int ch[N+M][2],fa[N+M],rev[N+M];inline void cur(int x,int y){ val[x]=Max[x]=y; }int vis[N];
inline void dfs(RG int x,RG int f,RG int d){if(vis[x]) return ;vis[x]=1; cur(x,0);if(f){ cur(n+d,d); fa[n+d]=f; fa[x]=n+d; } //将边转换成点插入树中for(RG int i=head[x];i;i=nxt[i])dfs(to[i],x,w[i]);
}inline bool cnm(int x,int y){ return e[x].w<e[y].w; }
inline void up(int x){Max[x]=max(Max[ch[x][0]],Max[ch[x][1]],cnm);Max[x]=max(Max[x],val[x],cnm);
}inline void reverse(int x){swap(ch[x][0],ch[x][1]);rev[x]^=1;
}inline void down(int x){if(!rev[x]) return ;reverse(ch[x][0]);reverse(ch[x][1]);rev[x]=0;
}inline bool is_root(int x){ return ch[fa[x]][0]!=x && x!=ch[fa[x]][1]; }inline bool lr(int x){ return x==ch[fa[x]][1]; }inline void rotate(int x){RG int y=fa[x],z=fa[y],k=lr(x);if(!is_root(y)) ch[z][lr(y)]=x;fa[x]=z; fa[ch[x][k^1]]=y; fa[y]=x;ch[y][k]=ch[x][k^1]; ch[x][k^1]=y;up(y); up(x);
}int st[N+M];
inline void splay(int x){RG int y=x,top=0;while(1){st[++top]=y;if(is_root(y)) break;y=fa[y];}for(RG int i=top;i;i--) down(st[i]);while(!is_root(x)){if(!is_root(fa[x])) rotate(lr(x)^lr(fa[x])?x:fa[x]);rotate(x);}
}inline void access(int x){RG int y=0;while(x){ splay(x);ch[x][1]=y; fa[y]=x;up(x); y=x; x=fa[x];}
}inline void make_root(int x){access(x); splay(x); reverse(x);
}inline int query(int x,int y){make_root(x); access(y); splay(y);return Max[y];
}inline int find(int x){while(fa[x]) x=fa[x];return x;
}inline void link(int x,int y){if(find(x)==find(y)) return ;make_root(x); fa[x]=y;
}inline void cut(int x,int y){make_root(x); access(y); splay(y);if(ch[y][0]==x) ch[y][0]=0,fa[x]=0,up(y);
}inline void Insert(int id){RG int x=e[id].u,y=e[id].v;if(find(x)==find(y)){RG int tmp=query(x,y);if(e[tmp].w<=e[id].w) return ;cut(n+tmp,e[tmp].u);cut(n+tmp,e[tmp].v);}cur(n+id,id);link(x,n+id);link(y,n+id);
}int Ans[N],top;
inline void work(){for(RG int i=1;i<=n;i++) dfs(i,0,0);while(--q){if(Q[q].op==2) Insert(Q[q].x);else Ans[++top]=e[query(Q[q].x,Q[q].y)].w;}for(RG int i=top;i;i--) printf("%d\n",Ans[i]);
}int main(){ init(); work(); return 0; }

转载于:https://www.cnblogs.com/Hero-of-someone/p/8053410.html

沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版相关推荐

  1. BZOJ2594 水管局长数据加强版LCT

    题意: 您有一个无向带权图,您需要支持两种操作. 询问两个点之间的最大权最小路径. 删除一条边. 分析: 众所周知,任意两点间最大权最小路径存在于最小生成树上,所以这道题可以动态维护最小生成树. 用到 ...

  2. link cut tree 入门

    鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...

  3. 15行代码AC——Link/Cut Tree CodeForces - 614A(爆long long处理+快速幂讲解)

    励志用少的代码做高效表达 Problem describe Programmer Rostislav got seriously interested in the Link/Cut Tree dat ...

  4. 模板:Link Cut Tree(LCT)

    文章目录 前言 解析 原理 rotate(x) splay(x) access(x) findroot(x) makeroot(x) split(x,y) link(x,y) cut(x,y) pus ...

  5. Link Cut Tree 学习笔记

    Link Cut Tree 学习笔记 说在前边 最近补 CF 碰见一道 LCT ,就打算学习一下这个东西...顺便复习一下 splay. 具体算法及实现 参考了FlashHu, Candy? P369 ...

  6. Link/Cut Tree学习笔记

    最近正是实验课的高峰期,我数了一下,除了毛概没有实验课,其他的课都有实验课...不过好在这些实验都不是很难.我尽力挤出时间用来刷题. 简介 Link/Cut Tree和树链剖分很相似,二者处理的问题也 ...

  7. Link Cut Tree详解

    Link Cut Tree ==Warning:千万不要跳读== 参考博客:https://www.cnblogs.com/flashhu/p/8324551.html 什么是动态树? 动态树问题, ...

  8. luogu P3690 【模板】Link Cut Tree (动态树)

    嘟嘟嘟 LCT竟然看了整整一天,但好歹是看懂了. 教程这里不写,强烈推荐 闪狐大佬的博客 . 但是还是有几句想说的. 1.尽管LCT和splay很像,但是有一些细节还是不一样的.首先是rotate,我 ...

  9. Link Cut Tree学习笔记

    捋一下思路 模板题:https://www.luogu.org/problemnew/show/P3690 推荐LCT的教程,个人认为很详细,本文做了部分引用:https://www.luogu.or ...

最新文章

  1. ubuntu安装thrift
  2. 要强大的“黑匣子”,还是“可解释”的机器学习?| 清华AI Time激辩
  3. python学习笔记(IO模型)
  4. 【数字信号处理】序列傅里叶变换 ( 基本序列的傅里叶变换 | 求 sinωn 的傅里叶变换 | 复变函数欧拉公式 )
  5. 二:SpringAOP
  6. 5高并发服务器:socket IPC
  7. boost::function的用法(一)
  8. 一个牛逼的Coder是这样诞生的
  9. Python正则表达式查找最长数字子串(好未来2017笔试题)
  10. S5PV210体系结构与接口02:ARM编程模型 汇编指令
  11. 使用谷歌语音识别打造语音管家HiVoice
  12. SciPy 非线性方程求解 | Python技能树征题
  13. atitit 项目硬件平台选型attilax总结4blg.docx
  14. PHP调整网页,用PHP程序实现支持页面后退的两种方法
  15. 【转载】别了,摩托罗拉(十一):小高尔文“新政”
  16. 变种WannaCry
  17. 抖音的10个规则。AI大数据帮你解决
  18. photoshop----剪切蒙版/置入图片
  19. 师创作业--Bank Account Management System 银行账户管理系统 简称BAM
  20. Spring Cloud (五):路由网关(Zuul)

热门文章

  1. 重学JAVA基础(三):动态代理
  2. Microsoft SQL Server 2008技术内幕:T-SQL查询---------逻辑查询处理
  3. Linux之find常用命令汇总
  4. python 控制 cmd 命令行颜色
  5. Ettus Research USRP B200/B210 simple case
  6. git多系统协作时换行符问题
  7. Delphi 2010 新增功能之: IOUtils 单元(1): 初识 TDirectory.GetFiles
  8. 生死狙击服务器名字怎么修改器,生死狙击修改金币方法
  9. 基于python的性能测试工具_基于 Python 的性能测试工具 locust 与 LR 的简单对比[转发]...
  10. 【写作技巧】毕业论文写作:本科、硕士论文写作必备数据库