【Balanced Binary Tree】[NOI2004]郁闷的出纳员

原创 2015年11月19日 13:22:00

题目
平衡树模板题,包含区间删除操作。

#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 100000
int n,pre,bk,mi,ans,cg,size;
struct node{
    int val,pri,cnt,lsize,rsize;
    node *ls,*rs;
}treap_tree[MAXN+10],*tcnt=treap_tree,*root;
void Read(int &x){
    char c;
    while(c=getchar(),c!=EOF)
        if(c>='0'&&c<='9'){
            x=c-'0';
            while(c=getchar(),c>='0'&&c<='9')
                x=x*10+c-'0';
            ungetc(c,stdin);
            return;
        }
}
void Rotate_left(node *&a){
    node *b=a->rs;
    a->rs=b->ls;
    b->ls=a;
    a->rsize=b->lsize;
    b->lsize=a->lsize+a->rsize+a->cnt;
    a=b;
}
void Rotate_right(node *&a){
    node *b=a->ls;
    a->ls=b->rs;
    b->rs=a;
    a->lsize=b->rsize;
    b->rsize=a->lsize+a->rsize+a->cnt;
    a=b;
}
void del(node *&p,int val){
    if(!p)
        return;
    if(val<=p->val){
        del(p->ls,val);
        if(p->ls)
            p->lsize=p->ls->lsize+p->ls->rsize+p->ls->cnt;
        else
            p->lsize=0;
    }
    else{
        ans+=p->cnt+p->lsize;
        p=p->rs;
        del(p,val);
    }
}
void Treap_insert(node *&p,int val){
    if(!p){
        p=++tcnt;
        p->cnt=1;
        p->val=val;
        p->pri=rand();
        return;
    }
    if(val>p->val){
        p->rsize++;
        Treap_insert(p->rs,val);
        if(p->rs->pri<p->pri)
            Rotate_left(p);
    }
    else if(val<p->val){
        p->lsize++;
        Treap_insert(p->ls,val);
        if(p->ls->pri<p->pri)
            Rotate_right(p);
    }
    else
        p->cnt++;
}
void pos_find(node *&p,int pos){
    if(pos<p->rsize)
        pos_find(p->rs,pos);
    else if(pos>=p->rsize+p->cnt)
        pos_find(p->ls,pos-p->rsize-p->cnt);
    else
        printf("%d\n",p->val+cg);
}
int main()
{
    char c[2];
    int i,a;
    srand(2015111913);
    Read(n),Read(mi);
    for(i=1;i<=n;i++){
        scanf("%s",c);
        Read(a);
        if(c[0]=='I'){
            if(a<mi)
                continue;
            size++;
            Treap_insert(root,a-cg);
        }
        else if(c[0]=='A')
            cg+=a;
        else if(c[0]=='S'){
            cg-=a;
            del(root,mi-cg);
        }
        else{
            if(a>size-ans)
                puts("-1");
            else
                pos_find(root,a-1);
        }
    }
    printf("%d\n",ans);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 博客地址 http://blog.csdn.net/outer_form 举报

相关文章推荐

NOI2004 郁闷的出纳员

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

[NOI2004]郁闷的出纳员

BZOJ1503 因为这道题是对所有人的工资进行修改,所以用一个“基准值”,每次只需要修改基准值就可以了。 实际工资 = 相对工资 + 基准值 剩下的就是treap#include #inclu...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

【NOI2004】郁闷的出纳员(splay tree WA中。。)

【NOI2004】郁闷的出纳员   Time Limit:10000MS  Memory Limit:65536K Total Submit:469 Accepted:179  ...

(题解)(Splay)NOI2004郁闷的出纳员

题目比较简单,用splay动态维护一个可以整体删除的集合, 不需要打下标,打个上标维护size求kth, 用delta记录偏移即可完成所有操作。   调试了两个小时,后来发现因初始工资而走的员工不能算...

[NOI 2004]郁闷的出纳员

这是一道练手的水题啦!写网络流怕把splay忘了,于是来练习一下splay。这是一道很经典的splay入门题,用size域查询排名,维护的仍然是有序表,只是由于涉及到删除插入的操作,包括询问排名,所以...

[BZOJ1503]NOI2004 郁闷的出纳员|splay

这题方法应该有很多,什么树状数组线段树都能搞。。 用splay的话就是维护工资序列咯,但是每次修改都逐个修改的话肯定会T掉,注意到修改是整体修改,所以只要维护一个相对的修改值,然后修改的时候要考虑上...

【Splay|Treap】poj3580 SuperMemo && bzoj1503 [noi2004]郁闷的出纳员

splay真的是一种十分耐吃的植物。啃了三四天终于啃熟了 orz  当然现在还仅限于模板题T T 很多东西还是要努力啊!!! debug的过程真的是十分的艰辛orz 找了毕克大魔王他说叫我再想想QAQ...

NOI2004 郁闷的出纳员

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 3565  Solved: 1280 [Submit...

【bzoj1503】 [NOI2004]郁闷的出纳员

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 11752  Solved: 4159 [Submit]...

bzoj1503【NOI2004】郁闷的出纳员

Treap模板
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)