zoukankan      html  css  js  c++  java
  • [WC2006]水管局长

    题目

    人傻常数大,bz显然是会(T)

    但我就是来复习一下(lct)的板子的

    发现就是让你最小化两点之间的最大路径,于是自然地想到了最小生成树

    发现删除操作好像不能在最小生成树上搞,于是我们离线下来倒序处理

    先用从头到尾都没有被删除的边做成一棵(MST)

    每加进来一条边,如果这两点不连通,那就直接连上,如果这两点联通,就看一下这两点之间的最大边权,如果大于当前的边权,那就删边连边

    于是(lct)维护一下就好了

    代码

    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    #define LL long long
    #define re register
    #define maxn 150005
    inline int read() {
    	char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
    	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
    }
    struct E{int u,v,w,o;}e[maxn];
    int f[maxn],sz[maxn];
    int ch[maxn][2],fa[maxn],mx[maxn],rev[maxn],st[maxn],Ans[maxn];
    int opt[maxn],X[maxn],Y[maxn];
    int n,m,Q,tot;
    std::map<LL,int> ma;
    inline int find(int x) {if(x==f[x]) return x;return f[x]=find(f[x]);}
    inline int cmp(E A,E B) {if(A.o==B.o) return A.w<B.w;return A.o<B.o;}
    inline int nroot(int x) {return ch[fa[x]][1]==x||ch[fa[x]][0]==x;}
    inline void merge(int a,int b) {
    	if(sz[a]>sz[b]) sz[a]+=sz[b],f[b]=a;
    		else sz[b]+=sz[a],f[a]=b;
    }
    inline void pushup(int x) {
    	mx[x]=x;
    	if(e[mx[ch[x][0]]].w>e[mx[x]].w) mx[x]=mx[ch[x][0]];
    	if(e[mx[ch[x][1]]].w>e[mx[x]].w) mx[x]=mx[ch[x][1]];
    }
    inline void pushdown(int x) {
    	if(!rev[x]) return;rev[x]=0;
    	rev[ch[x][0]]^=1;std::swap(ch[ch[x][0]][0],ch[ch[x][0]][1]);
    	rev[ch[x][1]]^=1;std::swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);
    }
    inline void rotate(int x) {
    	int y=fa[x],z=fa[y],k=ch[y][1]==x,w=ch[x][k^1];
    	if(nroot(y)) ch[z][ch[z][1]==y]=x;
    	ch[x][k^1]=y,ch[y][k]=w;
    	pushup(y),pushup(x),fa[x]=z,fa[y]=x,fa[w]=y;
    }
    inline void splay(int x) {
    	int top=0,y=x;st[++top]=x;
    	while(nroot(y)) st[++top]=fa[y],y=fa[y];
    	while(top) pushdown(st[top--]);
    	while(nroot(x)) {
    		int y=fa[x];
    		if(nroot(y)) rotate((ch[y][1]==x)^(ch[fa[y]][1]==y)?x:y);
    		rotate(x);
    	}
    }
    inline void access(int x) {
    	for(re int y=0;x;y=x,x=fa[x])
    		splay(x),ch[x][1]=y,pushup(x);
    }
    inline void makeroot(int x) {
    	access(x);splay(x);rev[x]^=1;std::swap(ch[x][1],ch[x][0]);
    }
    inline void link(int x,int y) {
    	makeroot(x);fa[x]=y;
    }
    inline void split(int x,int y) {
    	makeroot(x);access(y);splay(y);
    }
    inline void cut(int x,int y) {
    	split(x,y);ch[y][0]=fa[x]=0;pushup(y);
    }
    int main() {
    	n=read(),m=read(),Q=read();
    	for(re int i=1;i<=m;i++) {
    		e[i].u=read(),e[i].v=read(),e[i].w=read();
    		e[i].u+=m;e[i].v+=m;
    		if(e[i].u>e[i].v) std::swap(e[i].u,e[i].v);
    		ma[(LL)e[i].u*(LL)n+(LL)e[i].v]=i;
    	}
    	for(re int i=m+1;i<=n+m;i++) f[i]=i,sz[i]=1;
    	for(re int i=1;i<=Q;i++) {
    		opt[i]=read(),X[i]=read(),Y[i]=read();
    		X[i]+=m,Y[i]+=m;
    		if(X[i]>Y[i]) std::swap(X[i],Y[i]);
    		if(opt[i]==2) e[ma[(LL)X[i]*(LL)n+Y[i]]].o=1;
    	}
    	std::sort(e+1,e+m+1,cmp);ma.clear();
    	for(re int i=1;i<=m;i++) {
    		if(e[i].o) {ma[(LL)e[i].u*(LL)n+e[i].v]=i;continue;}
    		int xx=find(e[i].v),yy=find(e[i].u);
    		if(xx==yy) continue;
    		merge(xx,yy);link(i,e[i].u),link(i,e[i].v);
    	}
    	for(re int i=Q;i;--i) {
    		if(opt[i]==1) {
    			split(X[i],Y[i]);
    			Ans[++tot]=e[mx[Y[i]]].w;
    			continue;
    		}
    		int t=ma[(LL)X[i]*(LL)n+Y[i]];
    		int xx=find(X[i]),yy=find(Y[i]);
    		if(xx!=yy) {merge(xx,yy);link(t,X[i]),link(t,Y[i]);continue;}
    		split(X[i],Y[i]);
    		if(e[mx[Y[i]]].w>e[t].w) {
    			int j=mx[Y[i]];cut(j,e[j].u),cut(j,e[j].v);
    			link(t,X[i]),link(t,Y[i]);
    		}
    	}
    	while(tot) printf("%d
    ",Ans[tot--]);
    	return 0;
    }
    
  • 相关阅读:
    算法与数据结构基础
    算法与数据结构基础
    算法与数据结构基础
    分布式系统理论进阶
    分布式系统理论进阶
    分布式系统理论基础
    分布式系统理论进阶
    分布式系统理论基础
    dht 分布式hash 一致性hash区别
    排期模板
  • 原文地址:https://www.cnblogs.com/asuldb/p/10437071.html
Copyright © 2011-2022 走看看