fhq treap 30pts 求助(玄关)
查看原帖
fhq treap 30pts 求助(玄关)
1199534
ycy1124楼主2024/7/3 08:18
#include<bits/stdc++.h>
using namespace std;
struct Node{
	int l,r,key,val,len;
}a[1100001];
int tot=0,rot,ans=0,m,bj=0,js;	
void push_up(int p){
	a[p].len=a[a[p].l].len+a[a[p].r].len+1;
}
//-----------------------------------------合并 
int merge(int rot1,int rot2){
	if(rot1==0){
		return rot2;
	}
	else if(rot2==0){
		return rot1;
	}
	if(a[rot1].key<a[rot2].key){
		a[rot1].r=merge(a[rot1].r,rot2);
		push_up(rot1);
		return rot1;
	}
	else{
		a[rot2].l=merge(rot1,a[rot2].l);
		push_up(rot2);
		return rot2;
	}
}
//-----------------------------------------按权值拆 
void val_split(int now,int k,int &rot1,int &rot2){
	if(now==0){
		rot1=0;
		rot2=0;
		return;
	}
	else if(a[now].val<=k){
		rot1=now;
		val_split(a[rot1].r,k,a[rot1].r,rot2);
	}
	else{
		rot2=now;
		val_split(a[rot2].l,k,rot1,a[rot2].l);
	}
	push_up(now);
}
//-----------------------------------------按排名拆 
void k_split(int now,int k,int &rot1,int &rot2){
	if(now==0){
		rot1=0;
		rot2=0;
		return;
	}
	push_up(now);
	if(a[a[now].l].len<k){
		rot1=now;
		k_split(a[rot1].r,k-a[a[rot1].l].len-1,a[rot1].r,rot2);
	}
	else{
		rot2=now;
		k_split(a[rot2].l,k,rot1,a[rot2].l);
	}
	push_up(now);	
}
//-------------------------------------新建节点 
void New_Node(int val){
	if(val<m){
		js--;
		return;
	}
	a[++tot].key=rand()%114514+1;
	a[tot].l=0;
	a[tot].r=0;
	int rot1,rot2,now=tot;
	a[tot].len=1;
	a[tot].val=val;
	val_split(rot,val,rot1,rot2);
	rot=merge(merge(rot1,now),rot2);
}
//-------------------------------------查找 
void Find_val(int k){
	int rot1,rot2,rot3,rot4;
	k_split(rot,k-1,rot1,rot2);
	k_split(rot2,1,rot3,rot4);
	printf("%d\n",a[rot3].val);
	rot=merge(rot1,merge(rot3,rot4));
}
//-------------------------------------删除 
void Erase(int val){
	int rot1,rot2,rot3,rot4;
	val_split(rot,val-1,rot1,rot2);
	k_split(rot2,1,rot3,rot4);
	rot=merge(rot1,rot4);
}
void bfs(int val,int i){
	if(i==0){
		return;
	}
	bfs(val,a[i].l);
	bfs(val,a[i].r);
	if(a[i].val+val<m){
		ans++;
		js--;
		Erase(a[i].val);
		return;
	}
	a[i].val+=val;
	push_up(i);
}
void read(int &x){
	x=0;
	int f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-f;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x*=10;
		x+=ch-'0';
		ch=getchar();
	}
	x*=f;
}
//------------------------------------主函数 
int main(){
	srand(time(NULL));
	int n;
	read(n);
	read(m);
	for(int i=1;i<=n;i++){
		char ch;
		int k;
		cin>>ch;
		read(k);
		if(ch=='I'){
			New_Node(k);
			js++;
		}
		else if(ch=='A'){
			bfs(k,rot);
		}
		else if(ch=='S'){
			bfs(-k,rot); 
		}
		else{
			if(k>a[rot].len){
				printf("-1\n");
				continue;
			}
			Find_val(js-k+1);
		}
	}
	printf("%d",ans);
	return 0;
}

#2 #3 #5 #7 #8 #9 #10 WA

2024/7/3 08:18
加载中...