zoukankan      html  css  js  c++  java
  • 左偏树模板(带路径压缩)

    题目链接:戳我

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #define MAXN 100010
    using namespace std;
    int n,m;
    int a[MAXN<<2],rt[MAXN],fa[MAXN];
    struct Node{int ch[2],val,ff,dis;}t[MAXN<<2];
    inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
    inline int merge(int x,int y)
    {
    	if(t[x].val==-1) x=0;
    	if(t[y].val==-1) y=0;
    	if(x==0||y==0) return x+y;
    	if(t[x].val>t[y].val) swap(x,y);
    	t[x].ch[1]=merge(t[x].ch[1],y);
    	fa[t[x].ch[1]]=fa[t[x].ch[0]]=fa[x]=x;
    	if(t[t[x].ch[0]].dis<t[t[x].ch[1]].dis) swap(t[x].ch[0],t[x].ch[1]);
    	t[x].dis=t[t[x].ch[1]].dis+1;
    	return x;
    }
    inline int pop(int x)
    {
    	fa[t[x].ch[0]]=t[x].ch[0];
    	fa[t[x].ch[1]]=t[x].ch[1];
    	t[x].val=-1;
    	int tt=merge(t[x].ch[0],t[x].ch[1]);
    	fa[x]=tt;
    	return tt;
    }
    int main()
    {
    	#ifndef ONLINE_JUDGE
    	freopen("ce.in","r",stdin);
    	freopen("ce.out","w",stdout);
    	#endif
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++) scanf("%d",&t[i].val);
    	for(int i=1;i<=n;i++) fa[i]=i;
    	for(int i=1;i<=m;i++)
    	{
    		int op,x,y;
    		scanf("%d",&op);
    		if(op==1)
    		{
    			scanf("%d%d",&x,&y);
    			if(t[x].val==-1||t[y].val==-1) continue;
    			int a=find(x),b=find(y);
    			if(a!=b) merge(a,b);
    		}
    		else if(op==2)
    		{
    			scanf("%d",&x);
    			if(t[x].val==-1) {printf("-1
    ");continue;}
    			int ff=find(x);
    			printf("%d
    ",t[ff].val);
    			pop(ff);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    网络编程
    Ant path 匹配原则
    Android Html.fromhtml
    android AsyncTask
    Android 系统联系人相关URI
    Android 学习心得体会
    中国天气网api(json格式)
    android:textAppearance
    Android COLLATE LOCALIZED ASC
    Android 快递接口
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10650656.html
Copyright © 2011-2022 走看看