运用一个整体变量处理全局修改,在减工资的时候处理删除。
反正我是不会的,理解了别人的代码(改成了指针):
int del(node *&u,node *f)
{
if(u==null)return 0;
int k;//删除人数
if(u->key+lazy<m)
{
k=del(u->ch[1],u)+u->ch[0]->sz+1;
u->ch[1]->sz=u->sz-k;
u=u->ch[1];
u->f=f;
}
else
{
k=del(u->ch[0],u);//原谅我的语法之差,测试很久才知道传入u->ch[0]就修改了那个地方的值,如果先用一个y保存u->ch[0],再传入y,只会修改y所在点(原来的u->ch[0]所在点修改)的信息,而不会修改从u->ch[0]的信息
u->sz-=k;
}
return k;
}
出要是这个删除不好搞,其他的也没什么。
PS:据说有个坑点,一来就辞职的不算离开公司(连公司都没进.)
再PS:据说可以用线段树做,orz
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int maxn=1000002;
struct node
{
node *f;
node *ch[2];
int sz;
int key;
}*root,*null,S[maxn];
int ncnt;
void init()
{
ncnt=0;
null=&S[ncnt];
null->f=null->ch[0]=null->ch[1]=null;
null->sz=0;
null->key=0;
root=null;
}
node *newnode(int key)
{
node *u=&S[++ncnt];
u->ch[0]=u->ch[1]=null;
u->sz=1;
u->key=key;
u->f=null;
return u;
}
void pushup(node *u)
{
u->sz=u->ch[0]->sz+u->ch[1]->sz+1;
}
void rotate(node *u)
{
node *f=u->f;
if(f==null)return ;
node *ff=f->f;
int d=u==f->ch[1];
int dd=0;
if(ff!=null)dd=f==ff->ch[1];
if(u->ch[d^1]!=null)u->ch[d^1]->f=f;
f->ch[d]=u->ch[d^1];
u->ch[d^1]=f;
f->f=u;
u->f=ff;
if(ff!=null)ff->ch[dd]=u;
pushup(f);
pushup(u);
}
void splay(node *u,node *p)
{
if(u==null)return ;
while(u->f!=p)
{
node *f=u->f;
node *ff=f->f;
if(ff==p)
{
rotate(u);
break;
}
else
{
int d=u==f->ch[1];
int dd=f==ff->ch[1];
if(d==dd)rotate(f);
else rotate(u);
rotate(u);
}
}
if(p==null)root=u;
}
void insert(int key)
{
if(root==null)
{
root=newnode(key);
return ;
}
node *u=root;
node *y;
while(1)
{
u->sz++;
if(key<u->key)
{
if(u->ch[0]!=null)u=u->ch[0];
else
{
y=newnode(key);
y->f=u;
u->ch[0]=y;
break;
}
}
else
{
if(u->ch[1]!=null)u=u->ch[1];
else
{
y=newnode(key);
y->f=u;
u->ch[1]=y;
break;
}
}
}
splay(y,null);
}
int n,m;
int lazy;
char s[5];
int tot;//离开
int del(node *&u,node *f)
{
if(u==null)return 0;
int k;//删除人数
if(u->key+lazy<m)
{
k=del(u->ch[1],u)+u->ch[0]->sz+1;
u->ch[1]->sz=u->sz-k;
u=u->ch[1];//修改这个位置的值
u->f=f;
}
else
{
k=del(u->ch[0],u);
u->sz-=k;
}
return k;
}
int findkey(int k)
{
node *u=root;
while(1)
{
if(u->ch[0]->sz+1==k)
{
return u->key+lazy;
}
else if(u->ch[0]->sz>=k)u=u->ch[0];
else
{
k-=u->ch[0]->sz+1;
u=u->ch[1];
}
}
}
int k;
int main()
{
scanf("%d%d",&n,&m);
lazy=0;
tot=0;
init();
for(int i=1;i<=n;i++)
{
scanf("%s%d",s,&k);
if(s[0]=='I')
{
if(k>=m)
{
insert(k-lazy);
}
}
else if(s[0]=='A')lazy+=k;
else if(s[0]=='S')
{
lazy-=k;
tot+=del(root,null);
}
else
{
int g=root->sz-k+1;
if(g<=0)printf("-1\n");
else printf("%d\n",findkey(g));
}
}
printf("%d\n",tot);
return 0;
}