题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503

题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动删除。四种操作:(1)数列中增加一个元素,设置初始值x;若x小于Min则不插入;(2)所有的元素增加一个值det;(3)所有的元素减小一个值det;此时有可能有一些会被删除(4)询问目前所有元素中第K大的。最后输出删除了多少个。

思路:首先,因为增加和减小是对所有元素而言,因此这个值我们不插入而是单独保存,设这个值为det。那么插入一个元素x,我们插入x-det,这样保持插入的所有元素的真实值都是其加上det。然后,每次减小时,我们需要进行删除,那么插入一个Min-det的节点,并将其调整到根节点,然后左子树就是被删除的。之后,将根节点的右节点变为根节点。

int tot,root,k[N],L[N],R[N],f[N],s[N];

inline void pushUp(int x)
{
    if(x) s[x]=s[L[x]]+s[R[x]]+1;
}

inline void zig(int x)
{
    int y=f[x],z=f[y];
    if(z) L[z]==y?L[z]=x:R[z]=x;
    f[x]=z;
    L[y]=R[x];
    if(R[x]) f[R[x]]=y;
    R[x]=y;
    f[y]=x;
    pushUp(y);
    pushUp(x);
}

inline void zag(int x)
{
    int y=f[x],z=f[y];
    if(z) L[z]==y?L[z]=x:R[z]=x;
    f[x]=z;
    R[y]=L[x];
    if(L[x]) f[L[x]]=y;
    L[x]=y;
    f[y]=x;
    pushUp(y);
    pushUp(x);
}

inline void splay(int x)
{
    int y;
    while(y=f[x])
    {
        if(f[y])
        {
            if(L[f[y]]==y) L[y]==x?(zig(y),zig(x)):(zag(x),zig(x));
            else R[y]==x?(zag(y),zag(x)):(zig(x),zag(x));
        }
        else L[y]==x?zig(x):zag(x);
    }
    root=x;
}

inline void insert(int key)
{
    int x=root,y=0;
    for(;x;y=x,x=key<=k[x]?L[x]:R[x]);
    k[x=++tot]=key;
    if(y) key<=k[y]?L[y]=x:R[y]=x;
    f[x]=y; s[x]=1; splay(x);
}

inline int select(int K)
{
    int x=root;
    for(;s[L[x]]+1!=K;K<=s[L[x]]?x=L[x]:(K-=s[L[x]]+1,x=R[x]));
    splay(x);
    return k[x];
}

int main()
{
    int n,m,d=0,ans=0;
    RD(n,m);
    while(n--)
    {
        char op[10];
        int x;
        scanf("%s%d",op,&x);
        if(op[0]=='I'&&x>= m) insert(x-d);
        else if(op[0]=='A') d+=x;
        else if(op[0]=='S')
        {
            insert(m-(d-=x));
            ans+=s[L[root]]; root=R[root]; f[root]=0;
            pushUp(root);
        }
        else if(op[0]=='F') PR(x>s[root]?-1:select(s[root]-x+1)+d);
    }
    PR(ans);
    return 0;
}

BZOJ 1503 郁闷的出纳员(splay)的更多相关文章

  1. bzoj 1503郁闷的出纳员(splay)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 11759  Solved: 4163[Submit][Stat ...

  2. [BZOJ 1503]郁闷的出纳员(fhq treap)

    [BZOJ 1503]郁闷的出纳员 题面 第一行有两个非负整数n和min.n表示下面有多少条命令,min表示工资下界. 接下来的n行,每行表示一条命令.命令可以是以下四种之一: 名称 格式 作用 I命 ...

  3. 洛谷 1486/BZOJ 1503 郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13866  Solved: 5069[Submit][Stat ...

  4. BZOJ 1503 郁闷的出纳员 (treap)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13370  Solved: 4808[Submit][Stat ...

  5. BZOJ 1503 郁闷的出纳员(平衡树)(NOI 2004)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作 ...

  6. BZOJ 1503 郁闷的出纳员

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  7. BZOJ[NOI2004]郁闷的出纳员 | Splay板子题

    题目: 洛谷也能评测....还有我wa了10多次的记录233 题解: 不要想得太复杂,搞一个全局变量记录一下工资的改变量Delta,这样可以等询问的时候就输出val+Delta,然后插入的时候插入x- ...

  8. BZOJ 1503: [NOI2004]郁闷的出纳员 splay

    1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...

  9. NOI2004 郁闷的出纳员 Splay

    郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...

随机推荐

  1. the internal array pointer

    The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and ...

  2. In MySQL, a zero number equals any string

    最近在做项目的过程中发现了一个问题 数据库表 test  有个字段是 target_id  int(11),这个字段可能为零 使用如下查询 select * from test where targe ...

  3. 2018/03/10 每日一个Linux命令 之 cksum

    每日一个Linux命令 2018-03-10 Linux 命令 cksum cksum [文件]  今天楼下的一个大妈去世了,不仅感叹,现如今,真的和以前不一样了,楼上楼下都不知道住的是谁? cksu ...

  4. es新增字段,并设置默认值

    重新设置mapping 添加新的字段. 设置es允许脚本执行:elasticsearch.yml script.inline: true 然后执行脚本 POST linewell_assets_mgt ...

  5. 分块学习笔记qwq

    我没想到居然就学到分块了...哇我还一直觉得分块听起来挺牛逼的一直想学的来着qwq(其实之前好像vjudge上有道题是用分块做的?等下放链接qwq 所以想着就写个学习笔记趴qwq 首先知道分块的时间复 ...

  6. sass不识别中文字符的问题

    进入Koala安装目录,例如:C:\Program Files (x86)\Koala\rubygems\gems\sass-3.4.9\lib\sass 或者 C:\Ruby\lib\ruby\ge ...

  7. 奇特的Local System权限(转载)

    转载自:http://mp.weixin.qq.com/s?__biz=MzA3NTM1MzE4Nw==&mid=202597764&idx=1&sn=0cef1a40fb3c ...

  8. R之ddlpy函数学习[转载]

    转自:https://www.cnblogs.com/aloiswei/p/6032513.html 1.函数 ddply(.data, .variables, .fun = NULL, ..., . ...

  9. itertools模块(收藏)

    Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. count().cycle().repeat() 首先,我们看看itertools提供的几个“无限”迭代器: > ...

  10. B*树的定义

    B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针: B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2). 所以,B*树分配新结点的 ...