zoukankan      html  css  js  c++  java
  • [HDU1512]Monkey King(左偏树)

    用并查集维护猴子们的关系,强壮值用左偏树维护就行了

    Code

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #define N 100010
    using namespace std;
    
    int n,fa[N],m,fr[N];
    //fr[x]维护猴子x所在集合在左偏树上的编号 
    
    int Find(int x){return x==fa[x]?x:fa[x]=Find(fa[x]);}
    namespace Lt{
    	int cnt,l[N],r[N],v[N],d[N];
    	inline void Init(){
    		cnt=0;
    		memset(l,0,sizeof(l)),memset(r,0,sizeof(r));
    		memset(v,0,sizeof(v)),memset(d,0,sizeof(d));
    	}
    	int merge(int x,int y){
    		if(!x||!y) return x+y;
    		if(v[x]<v[y]) swap(x,y);
    		r[x]=merge(r[x],y);
    		if(d[r[x]]>d[l[x]]) swap(l[x],r[x]);
    		d[x]=d[r[x]]+1;
    		return x;
    	}
    	inline void clear(int x){l[x]=r[x]=d[x]=0;}//记得一定要清零 
    }
    
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    
    int main(){
    	while(~scanf("%d",&n)){
    		Lt::Init();
    		for(int i=1;i<=n;++i) Lt::v[i]=read(),fa[i]=fr[i]=i;
    		for(m=read();m--;){
    			int u=read(),v=read(),px=Find(u),py=Find(v),hhh;
    			if(px==py) puts("-1");
    			else{
    				fa[px]=hhh=py;
    				u=fr[px],v=fr[py];
    				int t1=Lt::merge(Lt::l[u],Lt::r[u]),t2=Lt::merge(Lt::l[v],Lt::r[v]);
    				Lt::clear(u),Lt::v[u]/=2;
    				Lt::clear(v),Lt::v[v]/=2;
    				t1=Lt::merge(t1,u),t2=Lt::merge(t2,v);
    				int x=Lt::merge(t1,t2);
    				printf("%d
    ",Lt::v[x]);
    				fr[hhh]=x;
    			}
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    hdu 1863
    数据结构与算法分析–Minimum Spanning Tree(最小生成树)
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    数据结构与算法分析 – Disjoint Set(并查集)
    数字逻辑电路课程设计报告
    高校成绩管理数据库系统的设计与实现
    PL/0编译器(java version) – SymbolTable.java
    [jquery]添加行内容后根据下拉菜单选择内容对比之前已有选项,若有重置再提示
    bootstrap-datetimepicker 日期控件的开始日期
  • 原文地址:https://www.cnblogs.com/void-f/p/9168879.html
Copyright © 2011-2022 走看看