社区讨论
全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 条回复,欢迎继续交流。
正在加载回复...