BZOJ 3732: Network|动态树
来源:互联网 发布:如何不花钱做网络推广 编辑:程序博客网 时间:2024/06/04 23:36
看了po姐的blog..算了我也LCT水一发..
正常的做法
lct就是维护最小生成树,然后维护链上的最大值
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<set> #include<map> #include<vector> #include<algorithm> #include<iostream> #define N 303333 using namespace std; int sc() { int i=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1; c=getchar();} while(c>='0'&&c<='9') i=i*10+c-'0',c=getchar(); return i*f; } bool rev[N];int fa[N],ch[N][2],mx[N],X[N],Y[N],v[N],st[N];int n,m,q;bool Root(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}void push_up(int x){ int l=ch[x][0],r=ch[x][1]; mx[x]=x; if(l&&v[mx[l]]>v[mx[x]])mx[x]=mx[l]; if(r&&v[mx[r]]>v[mx[x]])mx[x]=mx[r];}void push_down(int x){ if(rev[x]) { rev[ch[x][0]]^=1,rev[ch[x][1]]^=1; swap(ch[x][1],ch[x][0]);rev[x]=0; }}void rotate(int x){ int y=fa[x],z=fa[y],l,r; l=(ch[y][1]==x);r=l^1; if(!Root(y))ch[z][ch[z][1]==y]=x; fa[x]=z;fa[y]=x;fa[ch[x][r]]=y; ch[y][l]=ch[x][r];ch[x][r]=y; push_up(y),push_up(x);}void splay(int x){ int top=1; st[1]=x; for(int i=x;!Root(i);i=fa[i])st[++top]=fa[i]; while(top)push_down(st[top--]); while(!Root(x)) { int y=fa[x],z=fa[y]; if(!Root(y)) if(ch[z][0]==y^ch[y][0]==x) rotate(x); else rotate(y); rotate(x); }}void access(int x){ for(int t=0;x;t=x,x=fa[x]) splay(x),ch[x][1]=t,push_up(x);}void make_root(int x){ access(x),splay(x),rev[x]^=1;}void link(int x,int y){ make_root(x),fa[x]=y;}void cut(int x,int y){ make_root(x),access(y),splay(y); fa[x]=ch[y][0]=0; push_up(y);} int find(int x){ access(x); splay(x); while(ch[x][0])x=ch[x][0],push_down(x); return x;}int query(int x,int y){ make_root(x),access(y),splay(y); return mx[y];}void solve(int x){ int a=X[x],b=Y[x]; int fx=find(a),fy=find(b); if(fx==fy) { int f=query(a,b); if(v[f]<=v[x])return; cut(f,X[f]);cut(f,Y[f]); } link(x,a),link(x,b);}int main(){ n=sc();m=sc();q=sc(); for(int i=1;i<=n;i++)v[i]=-1,mx[i]=i; for(int i=1;i<=m;i++) { X[n+i]=sc(),Y[n+i]=sc(),v[n+i]=sc(); solve(n+i); } for(int i=1;i<=q;i++) { int x=sc(),y=sc(); printf("%d\n",v[query(x,y)]); } return 0;}
0 0
- BZOJ 3732: Network|动态树
- 【BZOJ 3732】Network kruskal树
- [BZOJ]3732: Network 最小生成树 LCA
- 【bzoj 3732】Network
- BZOJ 3732: Network
- BZOJ 3732: Network
- BZOJ 3732 Network Kruskal重构树
- BZOJ 3732: Network|Kruskal|Lca
- BZOJ 3732 Network Kruskal+倍增
- BZOJ 3732: Network(最小生成树+倍增)
- bzoj 3732: Network (最小生成树+LCA)
- BZOJ 3732 Network —— 最小生成树 + 倍增LCA
- BZOJ 3732 Network Kruskal+倍增LCA
- BZOJ 3732 Network 最小瓶颈路
- 倍增LCA(bzoj 3732: Network)
- BZOJ 3732: Network 最小瓶颈路
- 【主席树】BZOJ 1146 network网络管理
- 【BZOJ】Network 最小生成树+LCA
- 为什么iPhone4到iPhone4S坚持使用512MB内存 详解 给力
- 【代码笔记】iOS-日历
- iOS 6的闪退和内存教程
- 通过入栈出栈实现数学表达式的计算
- 未来世界 新的技术革命,这才能叫做游戏的次时代。
- BZOJ 3732: Network|动态树
- 广告创意如何激发读者的兴趣
- kidd风的IOS日志之使用AVFoundation生成缩略图
- rpmdb被损坏
- 粒子群算法工具箱
- 30分钟了解C++11新特性
- mvvm 模式
- android-代码实现xml中selector效果
- 当Activity的launchMode设为singleTask的时候,需要注意