zoukankan      html  css  js  c++  java
  • BZOJ 2594 【WC2006】 水管局长数据加强版

    题目链接:水管局长数据加强版

      好久没写博客了……

      上次考试的时候写了一发LCT,但是写挂了……突然意识到我已经很久没有写过LCT了,于是今天找了道题来练练手。

      首先,LCT这里不讲。这道题要求支持动态的查询两点间路径的最大值,还有删边的操作。很显然,把操作离线,倒过来做,删边变成了加边,那么只需要用LCT来动态维护最小生成树即可。和魔法森林那道题一样,把边看做点,丢到LCT中去,每次加边的时候如果形成了环,那么判断一下这条边是否需要替换掉环上的最大边,LCT即可。

      求删去的边的编号时可以通过给输入的边排序,每次在其中二分查找。注意边的标号不要弄混了。

      下面贴代码(自带巨大常数):

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
    #define maxn 1100010
    
    using namespace std;
    typedef long long llg;
    
    struct data{
    	int u,v,c,b,id;
    }a[maxn],b[maxn];
    int s[maxn][2],addv[maxn],maxv[maxn],ff[maxn];
    int val[maxn],d[maxn],n,m,q,fa[maxn],ans[maxn];
    bool rev[maxn];
    
    int getint(){
    	int w=0;bool q=0;
    	char c=getchar();
    	while((c>'9'||c<'0')&&c!='-') c=getchar();
    	if(c=='-') c=getchar(),q=1;
    	while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
    	return q?-w:w;
    }
    
    bool cmp1(data a,data b){return a.u==b.u?a.v<b.v:a.u<b.u;}
    bool cmp2(data a,data b){return a.b==b.b?a.c<b.c:a.b<b.b;}
    
    bool isroot(int u){return u!=s[fa[u]][0] && u!=s[fa[u]][1];}
    void update(int u){
    	int l=s[u][0],r=s[u][1]; maxv[u]=u;
    	if(val[maxv[l]]>val[maxv[u]]) maxv[u]=maxv[l];
    	if(val[maxv[r]]>val[maxv[u]]) maxv[u]=maxv[r];
    }
    
    void rotate(int u){
    	int p=fa[u],g=fa[p];
    	bool l=(u==s[p][1]),r=!l;
    	if(!isroot(p)) s[g][p==s[g][1]]=u;
    	fa[s[u][r]]=p; s[p][l]=s[u][r];
    	s[u][r]=p; fa[p]=u; fa[u]=g;
    	update(p); update(u);
    }
    
    void splay(int u){
    	d[d[0]=1]=u;
    	for(int i=u;!isroot(i);i=fa[i]) d[++d[0]]=fa[i];
    	for(int i=d[0],x;x=d[i],i;i--)
    		if(rev[x]){
    			swap(s[x][0],s[x][1]); rev[x]=0;
    			rev[s[x][0]]^=1; rev[s[x][1]]^=1; 
    		}
    	while(!isroot(u)){
    		int p=fa[u],g=fa[u];
    		if(!isroot(p)){
    			if((u==s[p][0])^(p==s[g][1])) rotate(p);
    			else rotate(u);
    		}
    		rotate(u);
    	}
    }
    
    int getf(int x){return ff[ff[x]]==ff[x]?ff[x]:ff[x]=getf(ff[x]);}
    void access(int u){for(int t=0;u;t=u,u=fa[u]) splay(u),s[u][1]=t,update(u);}
    void makert(int u){access(u);splay(u);rev[u]^=1;}
    void link(int u,int v){makert(u); fa[u]=v;}
    void cut(int u,int v){
    	makert(u); access(v); splay(v);
    	s[v][0]=fa[u]=0; update(v);
    }
    
    int query(int u,int v){
    	makert(u); access(v); splay(v);
    	return maxv[v];
    }
    
    int find(int u,int v){
    	int l=1,r=m,mid;
    	while(l!=r){
    		mid=(l+r)>>1;
    		if(u<a[mid].u || (u==a[mid].u && v<=a[mid].v)) r=mid;
    		else l=mid+1;
    	}
    	return l;
    }
    
    int main(){
    	File("a");
    	n=getint(); m=getint(); q=getint();
    	for(int i=1;i<=n;i++) ff[i]=i;
    	for(int i=1;i<=m;i++){
    		a[i].u=getint(),a[i].v=getint(),a[i].c=getint();
    		if(a[i].u>a[i].v) swap(a[i].u,a[i].v);
    	}
    	sort(a+1,a+m+1,cmp1);
    	for(int i=1;i<=m;i++) val[i+n]=a[i].c,a[i].id=i;
    	for(int i=1;i<=q;i++){
    		b[i].c=getint(),b[i].u=getint(),b[i].v=getint();
    		if(b[i].u>b[i].v) swap(b[i].u,b[i].v);
    		if(b[i].c==2) b[i].b=find(b[i].u,b[i].v),a[b[i].b].b=1;
    	}
    	sort(a+1,a+m+1,cmp2);
    	for(int i=1,u,v;i<=m;i++){
    		if(a[i].b) break;
    		u=a[i].u; v=a[i].v;
    		if(getf(u)!=getf(v)){
    			ff[getf(u)]=getf(v);
    			link(u,a[i].id+n);
    			link(v,a[i].id+n);
    		}
    	}
    	sort(a+1,a+m+1,cmp1);
    	for(int i=q,u,v,t;i;i--){
    		u=b[i].u,v=b[i].v;
    		if(b[i].c==1) ans[i]=val[query(u,v)];
    		else{
    			if(getf(u)==getf(v)){
    				t=query(u,v);
    				if(val[t]>a[b[i].b].c) cut(a[t-n].u,t),cut(a[t-n].v,t);
    				else continue;
    			}
    			link(u,b[i].b+n); link(v,b[i].b+n);
    		}
    	}
    	for(int i=1;i<=q;i++) if(b[i].c==1) printf("%d
    ",ans[i]);
    	return 0;
    }
    
  • 相关阅读:
    初识CSS
    网页特殊符号HTML代码大全
    HTML基础
    python :ascii codec can't decode byte 0xe8 in posit
    linux shell中单引号、双引号和没有引号的区别
    初识HTML
    Python操作 Memcache、Redis、RabbitMQ
    使用fastdfs-zyc监控FastDFS文件系统
    Python---初识堡垒机
    SQL Server ->> Online Index Rebuilding(联机索引重建)
  • 原文地址:https://www.cnblogs.com/lcf-2000/p/6361598.html
Copyright © 2011-2022 走看看