手敲左偏树求调
查看原帖
手敲左偏树求调
978583
Kayisama楼主2023/9/16 16:31

QAQ可能是我理解还不够透彻

只能A一个点,剩下都是WA

求调!

#include <bits/stdc++.h>
using namespace std;
//Start define.
namespace MySpace{
	#define max(a,b) (a>b?a:b)
	#define min(a,b) (a<b?a:b)
	#define lowbit(x) (x&(-x))
	template <typename T>
	inline T read(){
		register T now=0,nev=1;
		register char c=getchar();
		while(c<'0' || c>'9') {
			if(c=='-') nev=-1;
			c=getchar();
		}
		while(c>='0' && c<='9') now=(now<<1)+(now<<3)+(c&15),c=getchar();
		return now*nev;
	}
	template<typename T>
	T qpow(T a,T n,T p){
		T res=1;
		while (n){
			if (n&1) res=1ll*res*a%p;
			a=1ll*a*a%p;
			n>>=1;
		}
		return res;
	}
	template<typename T>
	T gcd(T a,T b){return (b>0?gcd(b,a%b):a);}
}
using namespace MySpace;
#define ndbg
//const int INF=0x66CCFF66;
const int maxn=1e6+5;
#define ls(x) tr[x].Ls
#define rs(x) tr[x].Rs
#define dis(x) tr[x].Dis
#define val(x) tr[x].Val
int n;
int opt,x;
int cnt;
int root=1;
struct node{
	int Ls,Rs;
	int Dis,Val;
}tr[maxn];
int merge(int x,int y){
#ifdef dbg
	printf("x: %d y: %d\n",x,y);
#endif
	if (!x||!y) return x+y;
	if (val(x)>val(y)) swap(x,y);
	rs(x)=merge(rs(x),y);
	if(dis(ls(x))<dis(rs(x))) swap(ls(x),rs(x));
	dis(x)=dis(rs(x))+1;
	return x;
}
void pop(int& x){
	val(x)=-1;
	x=merge(ls(x),rs(x));
	return;
}
int main(){
	n=read<int>();
	dis(0)=-1;
	while(n--){
		opt=read<int>();
		if (opt==1){
			x=read<int>();
			val(++cnt)=x;
			if (cnt!=1) merge(root,cnt);
		}else if (opt==2){
			printf("%d\n",val(root));
		}else{
			if (root && val(root)!=-1) pop(root);
		}
	}
	return 0;
}




2023/9/16 16:31
加载中...