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;
    }
    
  • 相关阅读:
    NetCore使用Log4Net记录日志
    WCF数据协议中XmlArrayItem标签不起作用的问题
    WTM Blazor,Blazor开发利器
    WTM5.0发布,全面支持.net5
    log4netdemo
    mes 入库单号 锁表方案
    线程基础篇-线程同步
    线程基础篇-线程和进程
    EF基础篇-Code First
    EF基础篇-DB First
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10650656.html
Copyright © 2011-2022 走看看