关闭

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

标签: c++数据结构
281人阅读 评论(0) 收藏 举报
分类:

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

#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);
}
0
0
查看评论

NOI2004郁闷的出纳员题解

描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个...
  • t14t41t
  • t14t41t
  • 2015-08-09 11:38
  • 981

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

题目比较简单,用splay动态维护一个可以整体删除的集合, 不需要打下标,打个上标维护size求kth, 用delta记录偏移即可完成所有操作。   调试了两个小时,后来发现因初始工资而走的员工不能算是走的员工,题目中没说明,太坑了。 在splay中,常用INF哨兵,但我没发现有人用nul...
  • kingpharaoh
  • kingpharaoh
  • 2015-08-20 15:14
  • 1206

BZOJ 1503 [NOI2004] 郁闷的出纳员 treap

题意: 链接 方法: treap 解析: 这是本蒟蒻的第二道treap题,第二遍写的时候update,左旋右旋,插入函数都可以大概写出来了(还是得练啊),然而del  函数却被虐了,自己也想到用个什么基准来记(不过怎么写基准啊喂!),还是看了题解才看明白基准的用法和del函数, ...
  • wzq_QwQ
  • wzq_QwQ
  • 2015-03-20 13:44
  • 2346

[BZOJ1503][NOI2004]郁闷的出纳员(平衡树splay)

海水是咸的,因为它包含了人世所有的泪水;泪水是咸的,因为它承载了太多的欢乐和苦悲。
  • Clove_unique
  • Clove_unique
  • 2016-03-23 16:07
  • 441

[noi 2004] 郁闷的出纳员

原题地址  花了一两天真正的熟悉了Treap,对于一个东西,本蒟蒻认为,不应该要会,还应会熟练的写,【像哈狗写这个只需十分钟】 好吧,话归正题 先推荐另类解法 戳进去   此题解法很多BIT , 权值线段树 ,各种平衡树(准备抽空写)。。。。 是一道很棒的...
  • DraZxlNDdt
  • DraZxlNDdt
  • 2016-03-23 21:56
  • 445

bzoj1503: [NOI2004]郁闷的出纳员(伸展树)

题目传送门 基本也算入门题了。解法: 就伸展树维护一下然后加个暴力吧。代码实现:#include<cstdio> #include<cstring> #include<cmath> using namespace std; int root; struct n...
  • Hanks_o
  • Hanks_o
  • 2017-10-23 19:46
  • 227

【LeetCode】Balanced Binary Tree 解题报告

【题目】 Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the...
  • ljiabin
  • ljiabin
  • 2014-10-12 20:15
  • 5815

codevs1286 郁闷的出纳员

#include #include #include #include #include #define lchild rt<<1,l,m #define rchild rt<<1|1,m+1,r using namespace std; st...
  • den1018638294
  • den1018638294
  • 2014-12-18 22:00
  • 202

LeetCode(110)Balanced Binary Tree

题目如下: 分析如下: 之前尝试一边计算深度,一边做判断,发现这是无法实现的。因为bool型的返回变量说明了返回值没有深度信息,而如果没有深度信息,那么就无法判断左子树和右子树的深度差是否为1.所以说明还要另外使用一个计算深度的函数来做辅助了。 我的代码: 看了一下,是个很正常的代码风格。 //...
  • feliciafay
  • feliciafay
  • 2014-01-16 07:46
  • 5071

Leetcode_110_Balanced Binary Tree

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42218839 Given a binary tree, determine if it is height-balanced. For this p...
  • pistolove
  • pistolove
  • 2014-12-28 21:35
  • 1408
    个人资料
    • 访问:98889次
    • 积分:2709
    • 等级:
    • 排名:第15760名
    • 原创:171篇
    • 转载:1篇
    • 译文:0篇
    • 评论:52条
    Contact me
    欢迎各位神犇对我博客中的错误进行指正,或和我进行交流
    最新评论