社区讨论
求助,蜜汁90
P1486[NOI2004] 郁闷的出纳员参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7yxbf7
- 此快照首次捕获于
- 2025/11/21 05:53 4 个月前
- 此快照最后确认于
- 2025/11/21 05:53 4 个月前
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<ctime>
#define INF 0x7fffffff
using namespace std;
struct node
{
int ch[2],w,rd,size,cnt;
}t[100005];
int cnt,root,ans;
void calc(int x){t[x].size=t[t[x].ch[0]].size+t[t[x].ch[1]].size+t[x].cnt;}
void rotate(int &x,int d)
{
int son=t[x].ch[d];
t[x].ch[d]=t[son].ch[d^1];
t[son].ch[d^1]=x;
calc(x);
x=son;
calc(x);
}
int New(int val)
{
t[++cnt].w=val;
t[cnt].rd=rand();
t[cnt].cnt=t[cnt].size=1;
return cnt;
}
void build()
{
New(-INF);
New(INF);
root=1;
t[1].ch[1]=2;
calc(root);
}
void ins(int &x,int w)
{
if(!x)
{
x=New(w);
calc(x);
return;
}
t[x].size++;
if(t[x].w==w)
{
t[x].cnt++;
return;
}
int d=t[x].w<w;
ins(t[x].ch[d],w);
if(t[t[x].ch[0]].rd<t[x].rd)
rotate(x,d);
}
void del(int &x,int w)
{
if(!x)
return;
if(t[x].w==w)
{
if(t[x].cnt>1)
{
t[x].cnt--;
t[x].size--;
ans++;
return;
}
int ls=t[x].ch[0];
int rs=t[x].ch[1];
if(ls!=0||rs!=0)
{
if(rs==0||t[ls].rd>t[rs].rd)
{
rotate(x,0);
del(t[x].ch[1],w);
}
else
{
rotate(x,1);
del(t[x].ch[0],w);
}
calc(x);
}
else
x=0,ans++;
return;
}
int d=t[x].w<w;
t[x].size--;
del(t[x].ch[d],w);
calc(x);
}
int rank_num(int x,int w)
{
if(!x)
return -1;
if(t[t[x].ch[0]].size>=w)
return rank_num(t[x].ch[0],w);
if(w<=t[t[x].ch[0]].size+t[x].cnt)
return t[x].w;
return rank_num(t[x].ch[1],w-t[x].cnt-t[t[x].ch[0]].size);
}
int pre(int w)
{
int p=root,ans=1;
while(p!=0)
{
if(t[p].w==w)
{
ans=p;
break;
}
if(t[p].w<w&&t[p].w>t[ans].w)ans=p;
if(t[p].w<w)p=t[p].ch[1];
else p=t[p].ch[0];
}
return t[ans].w;
}
int main()
{
int n,minn,delta=0,now=0;
scanf("%d%d",&n,&minn);
build();
int i,j,x;
char ch;
for(i=1;i<=n;i++)
{
scanf("%s",&ch);
scanf("%d",&x);
if(ch=='I')
if(x-delta>=minn)ins(root,x-delta),now++;
if(ch=='F')
{
if(now<x)
puts("-1");
else
printf("%d\n",rank_num(root,now-x+2)+delta);
}
if(ch=='A')
delta+=x,minn-=x;
if(ch=='S')
{
minn+=x;
delta-=x;
int a1=minn-1,a2;
while(pre(a1)!=-INF)
{
a2=a1;
a1=pre(a1);
del(root,pre(a2));
now--;
}
}
}
cout<<ans;
}
第6个点T了,不知道怎么调
回复
共 2 条回复,欢迎继续交流。
正在加载回复...