博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOI2004】郁闷的出纳员Splay版
阅读量:5371 次
发布时间:2019-06-15

本文共 3110 字,大约阅读时间需要 10 分钟。

学了Splay,,,练练手

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

#include
#include
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
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;}

这里写图片描述

转载于:https://www.cnblogs.com/cww97/p/7533997.html

你可能感兴趣的文章
随手练——HDU 5015 矩阵快速幂
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
linux的子进程调用exec( )系列函数
查看>>
zju 2744 回文字符 hdu 1544
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
前端笔记-bom
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
迷宫问题
查看>>
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
zoj 1232 Adventure of Super Mario
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
Redis常用命令
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
一个控制台程序,模拟机器人对话
查看>>