萌新刚学斐波那契堆1e-10ms,WA+RE+TLE求助qwq
查看原帖
萌新刚学斐波那契堆1e-10ms,WA+RE+TLE求助qwq
549855
Limie楼主2023/11/4 23:37

提交记录

代码:

#include<bits/stdc++.h>
namespace Limie{
	#define x first
	#define y second
	using namespace std;
	typedef long long LL;
	typedef pair<int,int> PII;
	typedef unsigned long long ULL;
	typedef long double LD;
}
using namespace Limie;
int n,m;
struct Node{
	int w,fa;
	vector<int> son;
}tr[100010]; 
int p[100010];
int h[100010],l[100010],r[100010],mn[100010];
int d[100010];
bool st[100010];
int find(int x)
{
	if(p[x]!=x)p[x]=find(p[x]);
	return p[x];
}
int merge(int x,int y)
{
	if(tr[x].w>tr[y].w||tr[x].w==tr[y].w&&x>y)x^=y^=x^=y;
	tr[x].son.push_back(y);
	tr[y].fa=x;
	return x; 
}
void rebuild(int x)
{
	int y=h[x];
	mn[x]=y;
	do{
		while(d[tr[y].son.size()]){
			int t=d[tr[y].son.size()];
			if(h[x]==t)h[x]=r[t];
			r[l[t]]=r[t],l[r[t]]=l[t];
			d[tr[y].son.size()]=0;
			int a=l[y],b=r[y];
			int la=y;
			y=merge(y,t);
			if(h[x]==la)h[x]=y;
			r[a]=y,l[y]=a,r[y]=b,l[b]=y;
		}
		d[tr[y].son.size()]=y;
		if(tr[mn[x]].w>tr[y].w||tr[mn[x]].w==tr[y].w&&mn[x]>y)mn[x]=y;
		y=r[y];
	}while(y!=h[x]);
	y=h[x];
	do{d[tr[y].son.size()]=0;}while(y!=h[x]);
}
int main()
{
	int i;
	cin>>n>>m;
	for(i=1;i<=n;i++){
		int x;
		cin>>x;
		tr[i].w=x,tr[i].fa=p[i]=mn[i]=h[i]=l[i]=r[i]=i;
	}
	while(m--){
		int x,y,ty;
		cin>>ty>>x;
		if(ty==1){
			cin>>y;
			if(st[x]||st[y])continue;
			x=find(x),y=find(y);
			if(x==y)continue;
			p[y]=x;
			if(tr[mn[x]].w>tr[mn[y]].w||tr[mn[x]].w==tr[mn[y]].w&&mn[x]>mn[y])
			mn[x]=mn[y];
			x=h[x],y=h[y];
			r[l[y]]=r[x],l[r[x]]=l[y];
			r[x]=y,l[y]=x;
		}
		else{
			if(st[x]){
				puts("-1");
				continue;
			}
			int rt=find(x);
			x=mn[rt];
			cout<<tr[x].w<<'\n';
			st[x]=1;
			if(h[rt]==x){
				if(r[x]==x){
					h[rt]=0;
					continue;
				}
				h[rt]=r[x];
			}
			int la=l[x];
			for(int y:tr[x].son)tr[y].fa=y,r[la]=y,l[y]=la,la=y;
			r[la]=r[x],l[r[x]]=la;
			rebuild(rt);
		}
	}
}

2023/11/4 23:37
加载中...