#Splay#洛谷 1486 [NOI2004]郁闷的出纳员
分析
考虑加减工资直接打标记,查询第\(k\)多可以用平衡树,
删除有点恶心,这里考虑Splay,将需要删除的部分的后继splay到根节点并将左子树断边
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int inf=0x7fffffff,N=2000011;
int n,mn,delta,ans;
inline signed iut(){
	rr int ans=0,f=1; rr char c=getchar();
	while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans*f;
}
inline void print(int ans){
	if (ans<0) putchar('-'),ans=-ans;
	if (ans>9) print(ans/10);
	putchar(ans%10+48);
}
struct Splay{
	int siz[N],cnt[N],son[N][2],fat[N],w[N],root,tot;
	inline void pup(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];}
	inline bool Is_R(int x){return son[fat[x]][1]==x;}
    inline void rotate(int x){
    	rr int Fa=fat[x],FFa=fat[Fa],wh=Is_R(x);
    	son[FFa][Is_R(Fa)]=x,fat[x]=FFa,son[Fa][wh]=son[x][wh^1],
    	fat[son[x][wh^1]]=Fa,son[x][wh^1]=Fa,fat[Fa]=x,pup(Fa),pup(x);
	}
	inline void splay(int x,int tar){
		for (;fat[x]!=tar;rotate(x)){
			rr int Fa=fat[x],FFa=fat[Fa];
			if (FFa!=tar) rotate((Is_R(x)^Is_R(Fa))?x:Fa);
		}
		if (!tar) root=x;
	}
    inline void Insert(int x){
    	rr int now=root,Fa=0;
    	while (now&&w[now]!=x)
    	    Fa=now,now=son[now][x>w[now]];
    	if (now) ++cnt[now];
    	else{
    		now=++tot;
    		if (Fa) son[Fa][x>w[Fa]]=now;
    		son[now][0]=son[now][1]=0,fat[now]=Fa,
			w[now]=x,cnt[now]=siz[now]=1;
		}
		splay(now,0);
	}
	inline void Fsplay(int x){
		rr int now=root;
		if (!now) return;
		while (son[now][x>w[now]]&&x!=w[now])
		    now=son[now][x>w[now]];
		splay(now,0);
	}
	inline signed pre(int x){
		Fsplay(x);
		rr int now=root;
		if (w[now]<x) return now;
		now=son[now][0];
		while (son[now][1]) now=son[now][1];
		return now;
	}
	inline signed suf(int x){
		Fsplay(x);
		rr int now=root;
		if (w[now]>x) return now;
		now=son[now][1];
		while (son[now][0]) now=son[now][0];
		return now;
	}
    inline signed Delete(int x){
    	rr int L=1,R=suf(x);
    	splay(L,0),splay(R,L);
    	rr int ans=siz[son[R][0]];
		son[R][0]=0,pup(R),pup(L);
		return ans;
	}
	inline signed kth(int rk){
		rr int now=root;
		if (siz[now]<rk) return -1;
		while (1){
			rr int lson=son[now][0];
			if (siz[lson]+cnt[now]<rk)
				rk-=siz[lson]+cnt[now],now=son[now][1];
				else if (rk<=siz[lson]) now=son[now][0];
				    else break;
		}
		splay(now,0);
		return w[now];
	}
	inline void BUILD(){Insert(-inf),Insert(inf);}
}Tre;
signed main(){
	n=iut(),mn=iut(),Tre.BUILD();
	for (rr int i=1;i<=n;++i){
		rr char c=getchar();
		while (!isalpha(c)) c=getchar();
		switch (c){
			case 'I':{
				rr int x=iut();
				if (x>=mn) Tre.Insert(x-delta);
				break;
			}
			case 'A':{
				delta+=iut();
				break;
			}
			case 'S':{
				delta-=iut();
				ans+=Tre.Delete(mn-delta-1);
				break;
			}
			case 'F':{
				rr int x=iut(),SIZ=Tre.siz[Tre.root];
				if (SIZ-2>=x) print(Tre.kth(SIZ-x)+delta);
				    else print(-1);
				putchar(10);
				break;
			}
		}
	}
	return !printf("%d",ans);
}
#Splay#洛谷 1486 [NOI2004]郁闷的出纳员的更多相关文章
- 洛谷.1486.[NOI2004]郁闷的出纳员(Splay)
		题目链接 /* BZOJ1503: 3164kb 792ms/824ms(新建节点) 洛谷 : 3.06mb 320ms/308ms(前一个要慢wtf 其实都差不多,但前者好写) 四种操作: A:所有 ... 
- 洛谷P1486 [NOI2004]郁闷的出纳员 [STL,平衡树]
		题目传送门 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ... 
- 洛谷P1486 [NOI2004]郁闷的出纳员(splay)
		题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ... 
- 洛谷 P1486 [NOI2004]郁闷的出纳员
		题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ... 
- 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】题解+AC代码
		题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ... 
- 洛谷P1486 [NOI2004]郁闷的出纳员
		Code: #include<cstdio> #include<algorithm> using namespace std; struct Node{ int s,val,t ... 
- 【洛谷P1486】郁闷的出纳员
		题目大意:维护一个平衡树,支持插入一个数,删除小于一个值的所有数,K 大值查询,每个节点权值加减一个数. 题解:所有节点权值加减操作可以考虑直接维护一个全局标记,删除小于一个值的所有数字为一个二分的过 ... 
- 洛谷 1486/BZOJ 1503 郁闷的出纳员
		1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13866 Solved: 5069[Submit][Stat ... 
- BZOJ 1503: [NOI2004]郁闷的出纳员  splay
		1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ... 
- BZOJ_1503  [NOI2004]郁闷的出纳员 【Splay树】
		一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题. 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点 ... 
随机推荐
- Flask遇到的坑及解决办法
			flask_script 在使用第三方包flask_script时,报一下错误 ModuleNotFoundError: No module named 'flask._compat' 问题时flas ... 
- 【NLP学习其3.5】词嵌入的特性,为什么词之间会有联系?
			词嵌入的特性 现在你有了一堆嵌入向量,我们可以开始学习他们之间的特性了 前情提要:https://www.cnblogs.com/DAYceng/p/14962528.html 先把各向量重新命名便于 ... 
- Golang标准库之bytes介绍
			本次主要介绍golang中的标准库bytes,基本上参考了 字节 | bytes .Golang标准库--bytes 文章. bytes库主要包含 5 大部分,即: 常量 变量 函数 Buffer R ... 
- 【Azure APIM】验证APIM删除后的恢复步骤
			问题描述 在Azure门户中,误删除API Management资源后,怎么办? 问题解答 遇见误删除的第一反应就是: 想恢复删除的内容,但是从门户上查看没有发现有可以操作的方面. (错误,Azure ... 
- Java 多线程------解决 实现继承 Thread类 方式线程的线程安全问题 方式二:同步方法
			1 package bytezero.threadsynchronization; 2 3 4 5 /** 6 * 使用同步方法解决实现 继承 Thread类 的线程安全问题 7 * 8 * 9 * ... 
- 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等)
			1.前言 为什么说是伪微服务框架,常见微服务框架可能还包括服务容错.服务间的通信.服务追踪和监控.服务注册和发现等等,而我这里为了在使用中的更简单,将很多东西进行了简化或者省略了. 年前到现在在开发一 ... 
- java基础 韩顺平老师的 面向对象(基础) 自己记的部分笔记
			194,对象内存布局 基本数据类型放在堆里面,字符串类型放在方法区. 栈:一般存放基本数据类型(局部变量) 堆:存放对象(Cat cat,数组等) 方法区:常量池(常量,比如字符串),类加载信息 19 ... 
- 【技术积累】Java 8 新特性
			一.Lambda表达式 Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使J ... 
- obsidian 日记本倒序汇总 获取标题显示 插件dataviewjs list
			obsidian 日记本倒序汇总 获取标题显示 插件dataviewjs list // dataviewjs function removeDuplicate(arr) { return arr.f ... 
- Set-Alias navi ./navi.bat  - 设置别名 - powershell入门 (后期改方案了,换npm script)
			需求 开机要启动好几个服务,原先都用vscode启动,觉得可能比较占内存,所以改成命令行 发现直接运行bat,需要输入./batName.bat 一次还行,天天输入就麻烦了 命令 Set-Alias ... 
