萌新FHQ90分求助
查看原帖
萌新FHQ90分求助
497498
weizichang楼主2022/11/19 13:30

#4错了,求助大佬帮帮QAQQAQ,(马蜂自认为还可以)

#include<iostream>
#include<cstdio>
#include<ctime>
#include<string>
using namespace std;
const int N=1e6;
struct node{
	int l,r,key,val,size,fa;
}fhq[N];
int n,m,cnt,pos[N],a[N],root;
int newnode(int val){
	fhq[++cnt].key=rand();
	fhq[cnt].size=1;
	fhq[cnt].val=val;
	return cnt;
}
void update(int now){
	fhq[now].size=1;
	if(fhq[now].l) fhq[now].size+=fhq[fhq[now].l].size,fhq[fhq[now].l].fa=now;
	if(fhq[now].r) fhq[now].size+=fhq[fhq[now].r].size,fhq[fhq[now].r].fa=now;
}
void split(int now,int k,int &x,int &y){
	if(!now) x=y=0;
	else{
		if(fhq[fhq[now].l].size<k){
			x=now;
			split(fhq[now].r,k-fhq[fhq[now].l].size-1,fhq[now].r,y);
		}
		else{
			y=now;
			split(fhq[now].l,k,x,fhq[now].l);
		}
		update(now);
	}
}
int merge(int x,int y){
	if(!x||!y){
		return x+y;
	}
	else{
		if(fhq[x].key<fhq[y].key){
			fhq[x].r=merge(fhq[x].r,y);
			update(x);
			return x;
		}
		else{
			fhq[y].l=merge(x,fhq[y].l);
			update(y);
			return y;
		}
	}
}
int getnum(int x){
	int num=fhq[fhq[x].l].size+1;
	while(fhq[x].fa){
		if(x==fhq[fhq[x].fa].r){
			num+=fhq[fhq[fhq[x].fa].l].size+1;
		}
		x=fhq[x].fa;
	}
	return num;
}
int x,y,z,w1,w2,w3,g;
int main(){
	srand(time(0));
	cin>>n>>m;
	fhq[0].size=fhq[0].val=fhq[0].fa=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		pos[a[i]]=newnode(a[i]);
		root=merge(root,pos[a[i]]);
	}
	while(m--){
		string op;
		int s,t;
		cin>>op>>s;
		if(op[0]=='T'){
			int g=getnum(pos[s]);
			split(root,g-1,x,y);
			split(y,1,y,z);
			root=merge(merge(y,x),z);
		}
		else if(op[0]=='B'){
			int g=getnum(pos[s]);
			split(root,g-1,x,y);
			split(y,1,y,z);
			root=merge(merge(x,z),y);
		}
		else if(op[0]=='I'){
			cin>>t;
			int g=getnum(pos[s]);
			split(root,g-2,x,y);//x<=g-2,w1=g-1,w2=g,w3=g+1,y>=g+2;
			split(y,1,w1,y);
			split(y,1,w2,y);
			split(y,1,w3,y);	
			if(t==-1){
				root=merge(merge(merge(merge(x,w2),w1),w3),y);
			}
			else if(t==0){
				root=merge(merge(merge(merge(x,w1),w2),w3),y);
			}
			else{
				root=merge(merge(merge(merge(x,w1),w3),w2),y);
			}
		}
		else if(op[0]=='A'){
			int g=getnum(pos[s]);
			cout<<g-1<<endl;
		}
		else{
			split(root,s-1,x,y);
			split(y,1,y,z);
			cout<<fhq[y].val<<endl;
			root=merge(merge(x,y),z);
		}
	}
	return 0;
}
2022/11/19 13:30
加载中...