[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;
}


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

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

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

NOI2004郁闷的出纳员题解

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

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

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

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

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

假spaly害人-洛谷P1486 郁闷的出纳员

https://www.luogu.org/problem/show?pid=1486#sub 我以前的spaly他妈全抄模版的,然后觉得这样太颓废了,就很装逼地想自己写这题; 其实我理论都懂的,...
  • largecub233
  • largecub233
  • 2017年03月06日 09:25
  • 437

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

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

[noi 2004] 郁闷的出纳员

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

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

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

codevs1286 郁闷的出纳员

#include #include #include #include #include #define lchild rt
  • den1018638294
  • den1018638294
  • 2014年12月18日 22:00
  • 202

BZOJ1503 NOI2004 郁闷的出纳员 题解&代码

题意太傻不多解释= =就是维护一个档案队列,按节点val建树思路: 从query操作(命令F)可以看出,这棵树的顺序核心在于value而不是一般的维护队列,这样的话相同value的节点显而易见地应该...
  • Rainbow6174
  • Rainbow6174
  • 2015年12月29日 18:11
  • 1059
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[NOI2004]郁闷的出纳员(Treap)
举报原因:
原因补充:

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