社区讨论

求助,蜜汁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 条回复,欢迎继续交流。

正在加载回复...