NOI 2004 郁闷的出纳员 Splay

简介:

网址:http://www.lydsy.com/JudgeOnline/problem.php?id=1503


所有的操作都比较简单,而对于调整工资,就必须思考下,不过也简单,直接变成调整界限,和新来员工工资即可,剩下的就是splay。。。

/**************************************************************
    Problem: 1503
    User: h6363817
    Language: C++
    Result: Accepted
    Time:992 ms
    Memory:3228 kb
****************************************************************/
 
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mm=100020;
const int oo=2e9;
struct SplayTree
{
    int son[mm][2],far[mm],val[mm],sum[mm];
    int rt,size;
    void PushUp(int x)
    {
        sum[x]=sum[son[x][0]]+sum[son[x][1]]+1;
    }
    void Link(int x,int y,int c)
    {
        far[x]=y,son[y][c]=x;
    }
    void Rotate(int x,int c)
    {
        int y=far[x];
        Link(x,far[y],son[far[y]][1]==y);
        Link(son[x][!c],y,c);
        Link(y,x,!c);
        PushUp(y);
    }
    void Splay(int x,int g)
    {
        for(; far[x]!=g;)
        {
            int y=far[x],cx=(son[y][1]==x),cy=(son[far[y]][1]==y);
            if(far[y]==g)Rotate(x,cx);
            else
            {
                if(cx==cy)Rotate(y,cy);
                else Rotate(x,cx);
                Rotate(x,cy);
            }
        }
        PushUp(x);
        if(!g)rt=x;
    }
    void NewNode(int y,int &x,int a)
    {
        x=++size;
        far[x]=y,val[x]=a,sum[x]=1;
        son[x][0]=son[x][1]=0;
    }
    void Insert(int a)
    {
        int x=rt;
        while(son[x][val[x]<a])x=son[x][val[x]<a];
        NewNode(x,son[x][val[x]<a],a);
        Splay(size,0);
    }
    void Prepare()
    {
        NewNode(size=0,rt,-oo);
        NewNode(rt,son[rt][1],oo);
        sum[rt]=2;
    }
    int Suc(int a)
    {
        int x=rt,ret=oo;
        while(x)
        {
            if(val[x]==a) return a;
            if(val[x]>a) ret=min(ret,val[x]);
            x=son[x][val[x]<a];
        }
        return ret;
    }
    int Pre(int a)
    {
        int x=rt,ret=-oo;
        while(x)
        {
            if(val[x]==a)return a;
            if(val[x]<a)ret=max(ret,val[x]);
            x=son[x][val[x]<a];
        }
        return ret;
    }
    int Find(int a)
    {
        int x=rt,ans=0;
        while(x)
        {
            if(val[x]==a) ans=x;
            x=son[x][val[x]<a];
        }
        return ans;
    }
    int Select(int k,int g)
    {
        int x=rt;
        while(sum[son[x][1]]!=k)
        {
            if(sum[son[x][1]]>k) x=son[x][1];
            else k-=(sum[son[x][1]]+1),x=son[x][0];
        }
        Splay(x,g);
        return val[x];
    }
    int Delete(int a)
    {
        int x=Find(a),ans=0;
        if(x)
        {
            Splay(1,0);
            Splay(x,1);
            ans=sum[son[x][0]];
            son[x][0]=0;
            Splay(x,0);
        }
        return ans;
    }
} spt;
int main()
{
    int n,m,w,a,ans;
    char s[5];
    while(~scanf("%d%d",&n,&m))
    {
        spt.Prepare();
        w=ans=0;
        while(n--)
        {
            scanf("%s%d",s,&a);
            if(s[0]=='I')
            {
                a-=w;
                if(a>=m-w) spt.Insert(a);
            }
            if(s[0]=='A') w+=a;
            if(s[0]=='S') w-=a,ans+=spt.Delete(spt.Suc(m-w));
            if(s[0]=='F')
            {
                if(spt.sum[spt.rt]<a+2) puts("-1");
                else printf("%d\n",spt.Select(a,0)+w);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


目录
相关文章
|
3月前
reverse_re3-入土为安的第十天
reverse_re3-入土为安的第十天
35 0
|
6月前
|
C++
【PTA】L1-019 谁先倒 (C++)
【PTA】L1-019 谁先倒 (C++)
80 0
【PTA】L1-019 谁先倒 (C++)
PTA猴子选大王(约瑟夫环问题)
PTA猴子选大王(约瑟夫环问题)
122 1
|
C++
【PAT甲级 - C++题解】1005 Spell It Right
【PAT甲级 - C++题解】1005 Spell It Right
63 0
|
存储 人工智能 算法
1732 51nod婚姻介绍所 后缀数组
1732 51nod婚姻介绍所 后缀数组
73 0
PTA 谁先倒
L1-019 谁先倒 分数 15 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。 下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
164 0
|
人工智能 Java
[HDU 7136] Jumping Monkey | 并查集 | 逆向思维
Jumping Monkey Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 747 Accepted Submission(s): 360
221 0
[HDU 7136] Jumping Monkey | 并查集 | 逆向思维
HDOJ/HDU 1328 IBM Minus One(水题一个,试试手)
HDOJ/HDU 1328 IBM Minus One(水题一个,试试手)
100 0
洛谷 P1877 BZOJ 2748 cogs 791 [HAOI2012]音量调节
题目描述 一个吉他手准备参加一场演出。他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量。在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少。
953 0