沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版
来自蒟蒻 \(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]水管局长数据加强版相关推荐
- BZOJ2594 水管局长数据加强版LCT
题意: 您有一个无向带权图,您需要支持两种操作. 询问两个点之间的最大权最小路径. 删除一条边. 分析: 众所周知,任意两点间最大权最小路径存在于最小生成树上,所以这道题可以动态维护最小生成树. 用到 ...
- link cut tree 入门
鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...
- 15行代码AC——Link/Cut Tree CodeForces - 614A(爆long long处理+快速幂讲解)
励志用少的代码做高效表达 Problem describe Programmer Rostislav got seriously interested in the Link/Cut Tree dat ...
- 模板:Link Cut Tree(LCT)
文章目录 前言 解析 原理 rotate(x) splay(x) access(x) findroot(x) makeroot(x) split(x,y) link(x,y) cut(x,y) pus ...
- Link Cut Tree 学习笔记
Link Cut Tree 学习笔记 说在前边 最近补 CF 碰见一道 LCT ,就打算学习一下这个东西...顺便复习一下 splay. 具体算法及实现 参考了FlashHu, Candy? P369 ...
- Link/Cut Tree学习笔记
最近正是实验课的高峰期,我数了一下,除了毛概没有实验课,其他的课都有实验课...不过好在这些实验都不是很难.我尽力挤出时间用来刷题. 简介 Link/Cut Tree和树链剖分很相似,二者处理的问题也 ...
- Link Cut Tree详解
Link Cut Tree ==Warning:千万不要跳读== 参考博客:https://www.cnblogs.com/flashhu/p/8324551.html 什么是动态树? 动态树问题, ...
- luogu P3690 【模板】Link Cut Tree (动态树)
嘟嘟嘟 LCT竟然看了整整一天,但好歹是看懂了. 教程这里不写,强烈推荐 闪狐大佬的博客 . 但是还是有几句想说的. 1.尽管LCT和splay很像,但是有一些细节还是不一样的.首先是rotate,我 ...
- Link Cut Tree学习笔记
捋一下思路 模板题:https://www.luogu.org/problemnew/show/P3690 推荐LCT的教程,个人认为很详细,本文做了部分引用:https://www.luogu.or ...
最新文章
- ubuntu安装thrift
- 要强大的“黑匣子”,还是“可解释”的机器学习?| 清华AI Time激辩
- python学习笔记(IO模型)
- 【数字信号处理】序列傅里叶变换 ( 基本序列的傅里叶变换 | 求 sinωn 的傅里叶变换 | 复变函数欧拉公式 )
- 二:SpringAOP
- 5高并发服务器:socket IPC
- boost::function的用法(一)
- 一个牛逼的Coder是这样诞生的
- Python正则表达式查找最长数字子串(好未来2017笔试题)
- S5PV210体系结构与接口02:ARM编程模型 汇编指令
- 使用谷歌语音识别打造语音管家HiVoice
- SciPy 非线性方程求解 | Python技能树征题
- atitit 项目硬件平台选型attilax总结4blg.docx
- PHP调整网页,用PHP程序实现支持页面后退的两种方法
- 【转载】别了,摩托罗拉(十一):小高尔文“新政”
- 变种WannaCry
- 抖音的10个规则。AI大数据帮你解决
- photoshop----剪切蒙版/置入图片
- 师创作业--Bank Account Management System 银行账户管理系统 简称BAM
- Spring Cloud (五):路由网关(Zuul)
热门文章
- 重学JAVA基础(三):动态代理
- Microsoft SQL Server 2008技术内幕:T-SQL查询---------逻辑查询处理
- Linux之find常用命令汇总
- python 控制 cmd 命令行颜色
- Ettus Research USRP B200/B210 simple case
- git多系统协作时换行符问题
- Delphi 2010 新增功能之: IOUtils 单元(1): 初识 TDirectory.GetFiles
- 生死狙击服务器名字怎么修改器,生死狙击修改金币方法
- 基于python的性能测试工具_基于 Python 的性能测试工具 locust 与 LR 的简单对比[转发]...
- 【写作技巧】毕业论文写作:本科、硕士论文写作必备数据库