_bzoj1503 [NOI2004]郁闷的出纳员【Splay】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1503

由于初始工资未达到下限而离开的员工不算在离开人数之内。。。坑爹。。。

然后就是写kth的时候,忘记考虑当前节点的值有可能出现了不止一次。。。

#include <cstdio>

const int maxn = 100005;

int n, min_salary, zengL, root, cnt = 1, t1, leave;
int ch[maxn][2], fa[maxn], siz[maxn], key[maxn], tm[maxn];
char opr;

inline void pushup(int x) {
	siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + tm[x];
}
inline void rotate(int x) {
	int y = fa[x];
	if (y == ch[fa[y]][0]) {
		ch[fa[y]][0] = x;
	}
	else {
		ch[fa[y]][1] = x;
	}
	fa[x] = fa[y];
	int dir = x == ch[y][1];
	ch[y][dir] = ch[x][dir ^ 1];
	fa[ch[x][dir ^ 1]] = y;
	ch[x][dir ^ 1] = y;
	fa[y] = x;
	pushup(y);
	pushup(x);
}
inline void splay(int x) {
	int p;
	char flag1, flag2;
	while (fa[x]) {
		p = fa[x];
		if (!fa[p]) {
			rotate(x);
		}
		else {
			flag1 = p == ch[fa[p]][1];
			flag2 = x == ch[p][1];
			if (flag1 ^ flag2) {
				rotate(x);
			}
			else {
				rotate(p);
			}
			rotate(x);
		}
	}
	root = x;
}
inline int houji(int val) {
	int rt = 0, x = root;
	while (x && val != key[x] + zengL) {
		if (val < key[x] + zengL) {
			rt = x;
			x = ch[x][0];
		}
		else {
			x = ch[x][1];
		}
	}
	return x? x: rt;
}
bool ist(int x, int val, int p, int dir) {
	if (!x) {
		++cnt;
		key[cnt] = val - zengL;
		tm[cnt] = 1;
		siz[cnt] = 1;
		fa[cnt] = p;
		ch[p][dir] = cnt;
		return true;
	}
	if (val == key[x] + zengL) {
		++tm[x];
		++siz[x];
		return false;
	}
	int d = val > key[x] + zengL;
	bool rt = ist(ch[x][d], val, x, d);
	pushup(x);
	return rt;
}
inline int kth(int k) {
	int x = root;
	while (k > siz[ch[x][1]] + tm[x] || k <= siz[ch[x][1]]) {
		if (k > siz[ch[x][1]] + tm[x]) {
			k -= siz[ch[x][1]] + tm[x];
			x = ch[x][0];
		}
		else {
			x = ch[x][1];
		}
	}
	return key[x] + zengL;
}

int main(void) {
	//freopen("in.txt", "r", stdin);
	scanf("%d%d", &n, &min_salary);
	key[1] = 2000000000;
	siz[1] = 1;
	tm[1] = 1;
	root = 1;
	while (n--) {
		while ((opr = getchar()) < ‘A‘);
		scanf("%d", &t1);
		if (opr == ‘I‘) {
			if (t1 >= min_salary && ist(root, t1, 0, 0)) {
				splay(cnt);
			}
		}
		else if (opr == ‘A‘ || opr == ‘S‘) {
			zengL += (opr == ‘A‘? t1: -t1);
			splay(houji(min_salary));
			leave += siz[ch[root][0]];
			ch[root][0] = 0;
			pushup(root);
		}
		else {
			printf("%d\n", t1 > siz[root] - 1? -1: kth(t1 + 1));
		}
	}
	printf("%d\n", leave);
	return 0;
}

  

时间: 2024-08-07 15:30:47

_bzoj1503 [NOI2004]郁闷的出纳员【Splay】的相关文章

NOI2004 郁闷的出纳员 Splay

郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反之,如果心情不好,就可能把他们的工资扣除一个相同的量.我真不知道除了调工资他还做什么其它事情. 工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离

【BZOJ1503】 [NOI2004]郁闷的出纳员 splay

splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && r->ch[1]->size+r->num>=k 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 struct Spla

BZOJ[NOI2004]郁闷的出纳员 | Splay板子题

题目: 洛谷也能评测....还有我wa了10多次的记录233 题解: 不要想得太复杂,搞一个全局变量记录一下工资的改变量Delta,这样可以等询问的时候就输出val+Delta,然后插入的时候插入x-Delta 不要想会不会有员工工资一样,直接插入就好,这样省不少代码量. 对于降工资操作,插入一个min-Delta节点,ans+=左子树大小,右儿子作为新的根节点 直接走的员工不要算ans #include<cstdio> #include<algorithm> #include&l

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

1503: [NOI2004] 郁闷的出纳员 Time Limit: 5 SecMemory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反之,如果心情不好,就可能把他们的工资扣除一个相同的量.我真不知道除了调工资他还做什么其它事情.工资的频繁调整

BZOJ 题目1503: [NOI2004]郁闷的出纳员(SBT+延迟操作)

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 8058  Solved: 2828 [Submit][Status][Discuss] Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反

bzoj 1503郁闷的出纳员(splay)

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 11759  Solved: 4163[Submit][Status][Discuss] Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反之

[BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反之,如果心情不好,就可能把他们的工资扣除一个相同的量.我真不知道除了调工资他还做什么其它事情.工资的频繁调

1503: [NOI2004]郁闷的出纳员 Treap

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 6263  Solved: 2190[Submit][Status] Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反之,如果心情不好,就可

bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 8705  Solved: 3027[Submit][Status][Discuss] Description OIER 公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是, 我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反