BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作
来源:互联网 发布:python 签到脚本 编辑:程序博客网 时间:2024/05/17 10:41
维护动态最大生成树
最开始YY了一个 线段树分治 kruskal重构树
然后觉得复杂度不对? 不过BJ对kruskal重构树也仅仅算理解 没写过。。
希望有人带带 QWQ 告诉我对不对、怎么做哦~
LCT维护最大生成树
加入一条边时
若两点未联通 直接加
否则找到两点路径上最小的边 看能不能替换掉
#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<set>#include<map>using namespace std;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}return x*f;}void print(int x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=400100,inf=0X3f3f3f3f;int n;int fa[N],ch[N][2];int mn[N],sum[N],tim[N],len[N];bool rev[N];inline bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}inline void pushup(int x){mn[x]=x;int ls=ch[x][0],rs=ch[x][1];if(ls && tim[mn[ls]]<tim[mn[x]]) mn[x]=mn[ls];if(rs && tim[mn[rs]]<tim[mn[x]]) mn[x]=mn[rs];sum[x]=sum[rs]+sum[ls]+len[x];}inline void pushdown(int x){if(rev[x]){rev[x]=0;if(ch[x][0]) rev[ch[x][0]]^=1;if(ch[x][1]) rev[ch[x][1]]^=1;swap(ch[x][0],ch[x][1]);}}void getdown(int x){if(!isroot(x))getdown(fa[x]);pushdown(x);}inline void rotate(int x){int y=fa[x],z=fa[y],l,r;l=(ch[y][1]==x);r=l^1;if(!isroot(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;pushup(y);pushup(x);}void splay(int x){getdown(x);int y,z;while(!isroot(x)){y=fa[x];z=fa[y];if(!isroot(y)){if((ch[z][0]==y)^(ch[y][0]==x)) rotate(x);else rotate(y);}rotate(x);}}void access(int x){int t=0;while(x){splay(x);ch[x][1]=t;pushup(x);t=x;x=fa[x];}}void rever(int x){access(x);splay(x);rev[x]^=1;}int find(int x){access(x);splay(x);while(ch[x][0])x=ch[x][0];return x;}void split(int u,int v){rever(u);access(v);splay(v);}void link(int u,int v){rever(u);fa[u]=v;}void cut(int u,int v){split(u,v);fa[u]=0;ch[v][0]=0;pushup(u);pushup(v);}int query_sum(int u,int v){split(u,v);return sum[v];}int U[N],V[N];int main(){n=read();int Q=read();register int i,j,u,v,pos,tmp;for(i=1;i<=n;++i) tim[i]=inf,mn[i]=i;char opt[10];while(Q--){scanf("%s",opt);switch(opt[0]){case 'f':pos=read()+n+1;u=U[pos]=read()+1;v=V[pos]=read()+1;mn[pos]=pos;tim[pos]=read();sum[pos]=len[pos]=read();if(find(u)!=find(v))link(u,pos),link(v,pos);else{split(u,v);tmp=mn[v];i=U[tmp];j=V[tmp];if(tim[tmp]<tim[pos])cut(tmp,i),cut(tmp,j),link(pos,u),link(pos,v);}break;case 'm':u=read()+1;v=read()+1;if(find(u)==find(v))print(query_sum(u,v)),puts("");else puts("-1");break;case 'c':pos=read()+n+1;splay(pos);len[pos]=read();pushup(pos);break;}}return 0;}
阅读全文
0 0
- BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作
- uoj#274. 【清华集训2016】温暖会指引我们前行 //LCT
- uoj 279: [清华集训2016]温暖会指引我们前行
- UOJ#274 BZOJ4736 【清华集训2016】温暖会指引我们前行
- 【uoj274】【清华集训2016】温暖会指引我们前行
- uoj274 温暖会指引我们前行
- 【BZOJ 4734】【UOJ 269】【清华集训2016】 如何优雅地求和
- UOJ【清华集训2015】V
- UOJ#267 BZOJ4731【清华集训2016】魔法小程序
- UOJ 267 [清华集训2016]魔法小程序
- BZOJ4735 你的生命已如风中残烛 UOJ#273 【清华集训2016】
- UOJ#273. 【清华集训2016】你的生命已如风中残烛
- uoj#164. 【清华集训2015】V
- uoj#46. 【清华集训2014】玄学
- BZOJ4730 UOJ#266【清华集训2016】Alice和Bob又在玩游戏
- UOJ#272. 【清华集训2016】石家庄的工人阶级队伍比较坚强
- UOJ#37.【清华集训2014】主旋律 状压DP
- [历史最值问题] UOJ #164 【清华集训2015】V
- 2017-12-20
- JS之函数
- 数据结构实验之排序二:交换排序
- Java设计模式之访问者模式
- 期末复习JAVA 闰年判断
- BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作
- 160个练手CrackMe-043
- angular查询
- HDOJ 2027 统计元音
- SLAM算法-----几种2D-slam算法比较
- JS能力评测经典题----编码规范
- Java并发编程:线程池的使用
- Python网络数据采集
- 专业英语(3)