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

题解:

比较裸的Splay;

整体修改工资用一个变量Tag维护,相当于Splay里的节点都加上Tag

删除的时候用一个点把走不走的员工给隔开,然后删除一整颗子树

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=500009;
int T,lim;
int ans;

int nn,root;
int tag;
int fa[maxn],ch[maxn][2],siz[maxn],cnt[maxn],ky[maxn];
int Splayinit(){
	ans=root=nn=tag=0;
	fa[0]=ch[0][0]=ch[0][1]=siz[0]=cnt[0]=ky[0]=0;
}

inline int son(int x){
	return ch[fa[x]][1]==x;
}
inline int pushup(int x){
	siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+cnt[x];
}

int Rotate(int x){
	int y=fa[x];
	int z=fa[y];
	int b=son(x),c=son(y);
	int a=ch[x][b^1];
	if(z)ch[z][c]=x;
	else root=x;
	fa[x]=z;
	if(a)fa[a]=y;
	ch[y][b]=a;
	fa[y]=x;ch[x][b^1]=y;
	pushup(y);pushup(x);
}

int Splay(int x,int i){
	while(fa[x]!=i){
		int y=fa[x];
		int z=fa[y];
		if(z==i){
			Rotate(x);
		}else{
			if(son(x)==son(y)){
				Rotate(y);Rotate(x);
			}else{
				Rotate(x);Rotate(x);
			}
		}
	}
}

int Ins(int val){
	int x=root,y=0;
	while(x){
		y=x;
		if(ky[x]==val){
			++cnt[x];++siz[x];Splay(x,0);
			return 0;
		}
		if(val>ky[x])x=ch[x][1];
		else x=ch[x][0];
	}
	x=++nn;
	fa[x]=y;ch[x][0]=ch[x][1]=0;
	siz[x]=cnt[x]=1;ky[x]=val;
	if(!y){
		root=x;
	}else{
		if(val>ky[y])ch[y][1]=x;
		else ch[y][0]=x;
	}
	Splay(x,0);
}

int Del(){
	Ins(lim-tag-1);
	ans=ans+siz[ch[root][0]]+cnt[root]-1;
	root=ch[root][1];
	fa[root]=0;
}

int Kth(int k){
	int x=root;
	for(int l;x;){
		l=ch[x][0];
		if(k<=siz[l]){
			x=ch[x][0];
		}else if(k>siz[l]+cnt[x]){
			k-=(siz[l]+cnt[x]);
			x=ch[x][1];
		}else{
			return ky[x];
		}
	}
}

int main(){
	scanf("%d%d",&T,&lim);
	Splayinit();
	while(T--){
		char opty=getchar();
		while((opty<‘A‘)||(opty>‘Z‘))opty=getchar();
		int x;
		scanf("%d",&x);
		if(opty==‘I‘){
			if(x<lim)continue;
			Ins(x-tag);
		}
		if(opty==‘A‘){
			tag+=x;
		}
		if(opty==‘S‘){
			tag-=x;
			Del();
		}
		if(opty==‘F‘){
			if(x>siz[root]){
				printf("-1\n");
			}else{
				x=siz[root]-x+1;
				printf("%d\n",Kth(x)+tag);
			}
		}
	}
	printf("%d\n",ans);
	return 0;
}

  

原文地址:https://www.cnblogs.com/zzyer/p/8179129.html

时间: 2024-10-14 00:39:12

BZOJ:1503: [NOI2004]郁闷的出纳员的相关文章

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

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

bzoj 1503: [NOI2004]郁闷的出纳员 平衡树

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

bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树

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

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

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

1503 [NOI2004]郁闷的出纳员

平衡树裸题. 对于加减操作,可以用lazy-tag思想,对一个标记进行加减.然后添加结点和删除不符合条件结点时考虑一下标记即可.添加薪水为k的结点,就是在平衡树中添加k-tag的结点:删掉薪水小于minwage的结点,就是在平衡树中删除minwage-tag的结点.然后随意玩即可. 我是用treap实现的. 1 #include <cstdio> 2 #include <cstdlib> 3 #include <algorithm> 4 5 using namespac

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

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

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

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

NOI2004 郁闷的出纳员 Splay

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