关闭

【NOI2004】郁闷的出纳员Splay版

标签: splay
239人阅读 评论(0) 收藏 举报
分类:

题目连接codevs1286
BZOJ1503,这里数据似乎强大一点,SlowSplay会TLE

学了Splay,,,练练手
多维护一个size域,就可以求k大值辣
昨晚调到接近3点还是RTE/WA,,cry
今天把每个节点加个cnt域就过了
(出现重复的数字的情况

#include<cstdio>
#include<algorithm>
using namespace std;
int m,d,ans;
struct Node{
    int key,s,cnt;//size
    Node *l,*r,*f;//left,right,father
};

class SplayTree{
public:
    void Init(){rt=NULL;}
    int S(Node *T){return (NULL==T)?0:T->s;}
    void Zag(Node *x){//left rotate
        Node *y=x->f;//y is the father of x
        y->r = x->l;
        if (x->l)x->l->f = y;//if x has left child
        x->f =y->f;
        if (y->f){//y is not root
            if (y==y->f->l)y->f->l=x;//y if left child
            else y->f->r=x;//y is right child
        }
        y->f=x;
        x->l=y;
        y->s=S(y->l)+S(y->r)+y->cnt;
        x->s=S(x->l)+S(x->r)+x->cnt;
    }
    void Zig(Node *x){//right rotate
        Node *y=x->f;//y is the father of x
        y->l = x->r;
        if (x->r)x->r->f=y;
        x->f = y->f;
        if (y->f){
            if (y==y->f->l)y->f->l=x;
            else y->f->r=x;
        }
        y->f=x;
        x->r=y;
        y->s=S(y->l)+S(y->r)+y->cnt;
        x->s=S(x->l)+S(x->r)+x->cnt;
    }
    void Splay(Node *x){
        while (x->f){
            Node *p=x->f;
            if (!p->f){
                if (x==p->l)Zig(x);
                else Zag(x);
            }else if (x==p->l){
                if (p==p->f->l){Zig(p);Zig(x);}
                else {Zig(x);Zag(x);}
            }else {//x==p->r
                if (p==p->f->r){Zag(p);Zag(x);}
                else {Zag(x);Zig(x);}
            }
        }
        rt=x;
    }

    void Insert(int x){
        Node *T=rt,*fa=NULL;
        while (T){
            fa=T;
            T->s++;
            if (x==T->key){T->cnt++;Splay(T);return;}
            else if (x<T->key)T=T->l;
            else {T=T->r;}
        }
        T=(Node*)malloc(sizeof(Node));
        T->key=x;
        T->l=T->r=NULL;
        T->f=fa;
        T->s=T->cnt=1;
        if (fa){
            if (fa->key>x)fa->l=T;
            else fa->r=T;
        }
        Splay(T);
    }

    int Findkth(Node *T,int k){//find the K-th biggest number
        if (k< S(T->r)+1)return Findkth(T->r,k);
        else if (k>S(T->r)+T->cnt)Findkth(T->l,k-S(T->r)-T->cnt);
        else {Splay(T);return T->key;}
    }
    void Goaway(Node *&T,Node *fa){
        if (NULL==T)return ;
        if (T->key>=m-d){Goaway(T->l,T);}
        else {
            ans+=S(T->l)+T->cnt;
            T=T->r;
            if (T)T->f=fa;
            if (fa==NULL)rt=T;
            Goaway(T,fa);
        }
        if (T)T->s=T->cnt+S(T->l)+S(T->r);
    }

    void Work(char ch,int x){
        if (ch=='I'&&x>=m)Insert(x-d);
        if (ch=='A')d+=x;
        if (ch=='S'){d-=x;Goaway(rt,NULL);}
        if (ch=='F'){
            if (S(rt) < x)puts("-1");
            else printf("%d\n",Findkth(rt,x)+d);
        }
    }

private:
    Node *rt;//root
};

int main(){
    freopen("fuck.in","r",stdin);
    SplayTree T;
    T.Init();
    int n,x;
    char ch;
    scanf("%d%d\n",&n,&m);
    for (;n--;){
        scanf("%c %d\n",&ch,&x);
        T.Work(ch,x);
    }
    printf("%d\n",ans);
    return 0;
}

这里写图片描述

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

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

郁闷的出纳员(splay)

bzoj一直 runtime codevs ac,表示无语。。。,应该是自己写炸了 #include #include #include #include #include #include us...
  • zhhx2001
  • zhhx2001
  • 2016-06-23 18:03
  • 138

NOI2004郁闷的出纳员

输入描述 Input Description第一行有两个非负整数n和min。n表示下面有多少条命令,min表示工资下界。接下来的n行,每行表示一条命令。命令可以是以下四种之一:名称 格式 作用 ...
  • w_yqts
  • w_yqts
  • 2017-03-19 10:07
  • 212

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

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

平衡树(splay treap)(普通平衡树,郁闷的出纳员)

splay模板普通平衡树#include #include #define MAXN 100005 int size,tcnt,root; struct tree{ int val,sz,cn...
  • yichengchangan
  • yichengchangan
  • 2017-06-19 19:11
  • 93

[NOI2004]郁闷的出纳员

之前SBT写过一次,Splay再写一次。 因为少加一对括号
  • u011439362
  • u011439362
  • 2014-07-10 17:34
  • 345

[noi 2004] 郁闷的出纳员

原题地址  花了一两天真正的熟悉了Treap,对于一个东西,本蒟蒻认为,不应该要会,还应会熟练的写,【像哈狗写这个只需十分钟】 好吧,话归正题 先推荐另类解法 戳进去   此题解法很多B...
  • DraZxlNDdt
  • DraZxlNDdt
  • 2016-03-23 21:56
  • 396

[省选前衡八题目整理][BZOJ 1503]郁闷的出纳员(Splay)

题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=1503思路嘴巴一下还是很简单的,就是个很裸的数据结构题,要求能够支持删除、加入结点以及查询第k...
  • qpswwww
  • qpswwww
  • 2015-03-23 18:38
  • 976

【HYSBZ 1503: [NOI2004]】郁闷的出纳员——伸展树

Time Limit: 5 Sec Memory Limit: 64 MBDescriptionOIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工...
  • huayunhualuo
  • huayunhualuo
  • 2016-05-18 21:24
  • 339

NOI2004郁闷的出纳员题解

[NOI2004] 郁闷的出纳员 ★★★ 输入文件:cashier.in 输出文件:cashier.out 简单对比 时间限制:1 s 内存限制:128 MB 【问题描述】 O...
  • qq_27138357
  • qq_27138357
  • 2015-08-10 11:38
  • 465
    个人资料
    • 访问:47462次
    • 积分:1714
    • 等级:
    • 排名:千里之外
    • 原创:124篇
    • 转载:6篇
    • 译文:0篇
    • 评论:17条
    最新评论