社区讨论

全WA,没过样例,铅条

P1486[NOI2004] 郁闷的出纳员参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjadxm0
此快照首次捕获于
2025/11/03 23:20
4 个月前
此快照最后确认于
2025/11/03 23:20
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,i,root,idx,mi,su1,su2,k;
long long ans,sss;
char opt;
struct node{
	long long v;
	int size1,cnt,p,s[2]={0,0};
	void init(int pp,long long vv){
		p=pp,v=vv;
		size1=cnt=1;
		return ;
	}
}tr[600010];
void pushup(int xp){
	tr[xp].size1=tr[tr[xp].s[0]].size1+tr[tr[xp].s[1]].size1+tr[xp].cnt;
	return ;
}
void rotate(int xr){
	int yr=tr[xr].p,zr=tr[yr].p;
	int kr=tr[yr].s[1]==xr;
	tr[yr].s[kr]=tr[xr].s[kr^1];
	tr[tr[xr].s[kr^1]].p=yr;
	tr[xr].s[kr^1]=yr;
	tr[yr].p=xr;
	tr[zr].s[tr[zr].s[1]==yr]=xr;
	tr[xr].p=zr;
	pushup(yr),pushup(xr);
}
void splay(int xs,int ks){
	int ys,zs;
	while(tr[xs].p!=ks){
		ys=tr[xs].p,zs=tr[ys].p;
		if(zs!=ks){
			if((tr[ys].s[0]==xs)^(tr[zs].s[0]==ys)){
				rotate(xs);
			}
			else{
				rotate(ys);
			}
		}
		rotate(xs);
	}
	if(ks==0) root=xs;
	return ;
}
void find1(int v1){
	int x1=root;
	while(tr[x1].v!=v1&&tr[x1].s[tr[x1].v<v1]){
		x1=tr[x1].s[tr[x1].v<v1];
	}
	splay(x1,0);
	return ;
}
void insert2(int v2){
	int x2=root,p2=0;
	while(x2&&v2!=tr[x2].v){
		p2=x2,x2=tr[x2].s[tr[x2].v<v2];
	}
	if(x2){
		tr[x2].cnt++;
	}
	else{
		x2=++idx;
		tr[p2].s[v2>tr[p2].v]=x2;
		tr[x2].init(p2,v2);
	}
	splay(x2,0);
	return ;
}
int pre7(int v7){
	find1(v7);
	int x7=root;
	if(tr[x7].v<v7) return x7;
	x7=tr[x7].s[0];
	while(tr[x7].s[1]){
		x7=tr[x7].s[1];
	}
	return x7;
}
int hou8(int v8){
	find1(v8);
	int x8=root;
	if(tr[x8].v>v8) return x8;
	x8=tr[x8].s[1];
	while(tr[x8].s[0]){
		x8=tr[x8].s[0];
	}
	return x8;
}
void del6(int v6){
//	cout<<v6<<" ";
	int pre6=pre7(v6);
	int hou6=hou8(v6);
	splay(pre6,0);
	splay(hou6,pre6);
	int x6=tr[hou6].s[0];
	sss+=tr[x6].cnt;
//	cout<<hou6<<" "<<x6<<" "<<(tr[x6].v)<<" "<<(tr[x6].cnt)<<" "<<"size: "<<sss<<"\n";
	tr[hou6].s[0]=0;
	splay(hou6,0);
	return ;
}
void add3(int v3,int ge){
	if(tr[ge].v==-2000000010||tr[ge].v==2000000010)  return ;
	if(tr[ge].s[0]) add3(v3,tr[ge].s[0]);
	if(tr[ge].s[1])	add3(v3,tr[ge].s[1]);
	tr[ge].v+=v3;
	if(tr[ge].v<mi){
		del6(tr[ge].v);
	}
	return ;
}
long long getval4(int k4){
	int x4=root;
	while(1){
		int y4=tr[x4].s[1];
		if(y4==0) break;
		if(tr[y4].size1+tr[x4].cnt<k4){
			k4=k4-(tr[y4].size1+tr[x4].cnt);
			x4=tr[x4].s[0];
		}
		else{
			if(tr[y4].size1>=k4){
				x4=y4; 
			}
			else break;
		}
	}
	splay(x4,0);
	return tr[x4].v;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>mi;
	insert2(-2000000010);
	insert2(2000000010);
	su1=1;
	for(i=1;i<=n;i++){
		cin>>opt>>k;
		if(opt=='I'){
			if(k<mi){
				continue;
			}
			insert2(k);
//			cout<<"cnt: "<<tr[3].cnt<<"\n";
		}
		else if(opt=='A'){
			add3(k,root);
		}
		else if(opt=='S'){
			k=-k;
			add3(k,root);
		}
		else{
			if((idx-sss)-2<k) cout<<"-1"<<"\n";
			else{
				ans=getval4(k+1);
				if(ans<1000000000&&ans>-1000000000) cout<<ans<<"\n";
				else cout<<"-1\n";
			}
		}
//		cout<<"size"<<i<<": "<<(idx-sss)<<"\n";
	}
	cout<<(sss);
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...