[NOI2004]郁闷的出纳员(Treap)

原创 2015年07月10日 19:55:59

【题解】

Treap水过

注意:对于null结点,不能进行 o->s = o->ch[0]->s + 1 + o->ch[1]->s 操作,一定要考虑此问题


【代码】

#include<stdio.h>
#include<stdlib.h>
int ans=0;
struct Node
{
	Node* ch[2];
	int v,r,s;
	int cmp_v(int x) const
	{
		if(x==v) return -1;
		if(x<v) return 0;
		return 1;
	}
	int cmp_s(int x) const
	{
		if( x == ch[0]->s + 1 ) return -1;
		if( x <= ch[0]->s ) return 0;
		return 1;
	}
};
Node *root,*null;
void init()
{
	null=new Node();
	null->ch[0] = null->ch[1] = NULL;
	null->v = null->r = null->s = 0;
	root=null;
}
void gets(Node* &o) 
{
	o->s = o->ch[0]->s + o->ch[1]->s + 1;
}
void xz(Node* &o,int d)
{
	Node* k=o->ch[d^1];
	o->ch[d^1]=k->ch[d];
	k->ch[d]=o;
	gets(o);
	gets(k);
	o=k;
}
void tj(Node* &o,int x)
{
	int d;
	if(o==null)
	{
		o=new Node();
		o->ch[0] = o->ch[1] = null;
		o->v=x;
		o->r=rand();
		o->s=1;
		return;
	}
	o->s++;
	d=o->cmp_v(x);
	if(d==-1) d=0;
	tj(o->ch[d],x);
	if( o->ch[d]->r < o->r ) xz(o,d^1);
}
void sc(Node* &o,int x)
{
	int d;
	if(o==null) return;
	d=o->cmp_v(x);
	if(d!=1)
	{
		sc(o->ch[0],x);
		gets(o);
		return;
	}
	ans += o->ch[0]->s + 1;
	o=o->ch[1];
	sc(o,x);
}
int find(Node* &o,int x)
{
	int d=o->cmp_s(x);
	if(d==-1) return o->v;
	if(d==1) x -= o->ch[0]->s + 1;
	return find(o->ch[d],x);
}
int main()
{
	srand(233);
	char opt;
	int n,min,x,add=0;
	scanf("%d%d",&n,&min);
	init();
	for(;n>0;n--)
	{
		scanf("\n%c %d",&opt,&x);
		if(opt=='I')
			if(x>=min) tj(root,x-add);
		if(opt=='A') add+=x;
		if(opt=='S')
		{
			add-=x;
			sc(root,min-add);
		}
		if(opt=='F')
		{
			if( root->s >= x ) printf("%d\n",find(root,root->s-x+1)+add);
			else printf("-1\n");
		}
	}
	printf("%d",ans);
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

NOI2004郁闷的出纳员----可持久化Treap

可持久化treap

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

题意: 链接 方法: treap 解析: 这是本蒟蒻的第二道treap题,第二遍写的时候update,左旋右旋,插入函数都可以大概写出来了(还是得练啊),然而del  函数却被虐了,自己也想...
  • wzq_QwQ
  • wzq_QwQ
  • 2015年03月20日 13:44
  • 1940

Tyvj P1851 [NOI2004]郁闷的出纳员(Treap)

题目链接 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任...

bzoj 1503 [NOI2004]郁闷的出纳员 平衡树(treap/Splay)

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

[Vijos P1507][NOI 2004]郁闷的出纳员(Treap)

DescriptionOIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调...
  • zars19
  • zars19
  • 2017年02月10日 11:11
  • 145

【Treap】[NOI 2004]郁闷的出纳员

解析:这道题目就是个裸题 每次操作的时候正常维护就行了#include #include #include using namespace std; #define maxn 2000005struc...

【Treap/非旋转Treap】BZOJ1503 [NOI2004]郁闷的出纳员

郁闷的出纳员 非旋转Treap的经典题啊…… 题面如下: DescriptionOIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本...
  • linkfqy
  • linkfqy
  • 2017年04月20日 20:04
  • 419

bzoj1503【NOI2004】郁闷的出纳员

Treap模板

NOI2004郁闷的出纳员题解

[NOI2004] 郁闷的出纳员 ★★★ 输入文件:cashier.in 输出文件:cashier.out 简单对比 时间限制:1 s 内存限制:128 MB 【问题描述】 O...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[NOI2004]郁闷的出纳员(Treap)
举报原因:
原因补充:

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