萌新刚学 OI,求助左偏树(不是要调代码)
  • 板块学术版
  • 楼主0xyz
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/4/22 19:46
  • 上次更新2023/10/23 17:46:02
查看原帖
萌新刚学 OI,求助左偏树(不是要调代码)
891963
0xyz楼主2023/4/22 19:46
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=0;ch=getchar();}
	while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return f?x:-x;
}
inline void write(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>=10)write(x/10);
	putchar(x%10+48);
}
int n,m,v[300010],t[300010],l[300010],r[300010],d[300010];
int sz[300010],rt[300010],f[300010],tag=0;
multiset<int>s;
int merge(int x,int y){
	if(!x||!y)return x+y;
	if(v[x]<v[y])swap(x,y);
	f[r[x]=merge(r[x],y)]=x;
	if(d[r[x]]>d[l[x]])swap(l[x],r[x]);
	d[x]=d[r[x]]+1;
	return x;
}
int find(int x){
	return x==rt[x]?x:rt[x]=find(rt[x]);
}
void pushdown(int x,int qwq){
	if(!x)return;
	v[x]+=qwq;
	pushdown(l[x],qwq);
	pushdown(r[x],qwq);
}
int main(){
	//freopen("kittle0.in","r",stdin);
	//freopen("kittle0.out","w",stdout);
	n=read();d[0]=-1;
	for(int i=1;i<=n;i++){
		v[i]=read();rt[i]=i;sz[i]=1;
		s.insert(v[i]);
	}
	m=read();
	for(int x,y,p,q;m;m--){
		string op;
		cin>>op; 
		if(op=="U"){
			x=read();y=read();
			x=find(x);y=find(y);
			if(x!=y){
				if(sz[x]>sz[y])swap(x,y);
				pushdown(x,t[x]-t[y]);
				rt[x]=rt[y]=merge(x,y);
				if(rt[x]==x){
					s.erase(s.find(v[y]+t[y]));
					t[x]=t[y];sz[x]+=sz[y];t[y]=sz[y]=0;
				}else{
					s.erase(s.find(v[x]+t[y]));
					sz[y]+=sz[x];t[x]=sz[x]=0;
				}
			}
		}else if(op=="A1"){
			x=read();y=find(x); 
			if(x==y){
				s.erase(s.find(v[x]+t[x]));
				f[l[x]]=f[r[x]]=0;
				y=merge(l[x],r[x]);v[x]+=read();
				f[x]=l[x]=r[x]=d[x]=0;
				rt[x]=rt[y]=p=merge(x,y);
				if(x!=p){
					t[p]=t[x];t[x]=0;
					sz[p]=sz[x];sz[x]=0;
				}
				s.insert(v[p]+t[p]);
			}else{
				f[l[x]]=f[r[x]]=f[x];
				p=merge(l[x],r[x]);
				if(x==r[f[x]])r[f[x]]=p;
				else l[f[x]]=p;
				v[x]+=read();
				f[x]=l[x]=r[x]=d[x]=0;
				rt[x]=rt[y]=merge(x,y);
				if(rt[x]==x){
					s.erase(s.find(v[y]+t[y]));
					s.insert(v[x]+t[y]);
					t[x]=t[y];sz[x]=sz[y];t[y]=sz[y]=0;
				}
			}
		}else if(op=="A2"){
			x=find(read());
			s.erase(s.find(v[x]+t[x]));
			t[x]+=read();
			s.insert(v[x]+t[x]);
		}else if(op=="A3")tag+=read();
		else if(op=="F1"){
			x=read();
			cout<<v[x]+t[find(x)]+tag<<'\n';
		}else if(op=="F2"){
			x=find(read());
			cout<<v[x]+t[x]+tag<<'\n';
		}else cout<<*s.rbegin()+tag<<'\n';
	}
	return 0;
}
2023/4/22 19:46
加载中...