【NOI2004】【洛谷P1486】郁闷的出纳员(Splay写法)
时间:2019-01-23
本文章向大家介绍【NOI2004】【洛谷P1486】郁闷的出纳员(Splay写法),主要包括【NOI2004】【洛谷P1486】郁闷的出纳员(Splay写法)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
平衡树简单题
因为是全局加减
维护一下全局一个表示当前工资加减情况
删除就把最低要求的后继到根
然后把左儿子删去就是了
因为个人代码是旋转了后继,为了保证有后继要先插入一个极大值
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
char ch=getchar();
int res=0,f=1;
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
return res*f;
}
const int N=100006;
char c[5];
int fa[N],son[N][2],rt,tot,n,add,mn,num,ans,siz[N],val[N],cnt[N];
#define lc(u) son[u][0]
#define rc(u) son[u][1]
inline void pushup(int u){
siz[u]=siz[lc(u)]+siz[rc(u)]+cnt[u];
}
inline void rotate(int v){
int u=fa[v],z=fa[u];
int t=(rc(u)==v);
son[z][rc(z)==u]=v;
fa[v]=z;
son[u][t]=son[v][t^1];
fa[son[v][t^1]]=u;
fa[u]=v,son[v][t^1]=u;
pushup(u),pushup(v);
}
inline void splay(int v,int goal){
while(fa[v]!=goal){
int u=fa[v],z=fa[u];
if(z!=goal)
(lc(z)==u)^(lc(u)==v)?rotate(v):rotate(u);
rotate(v);
}
if(!goal)rt=v;
}
inline void insert(int x){
int u=rt,f=0;
while(u&&val[u]!=x){
f=u,u=son[u][x>val[u]];
}
if(u)cnt[u]++;
else{
u=++tot;if(f)son[f][x>val[f]]=u;
fa[u]=f;val[u]=x,siz[u]=cnt[u]=1;
}
splay(u,0);
}
inline void find(int x){
int u=rt;
if(!u)return;
while(son[u][x>val[u]]&&val[u]!=x)
u=son[u][x>val[u]];
splay(u,0);
}
inline int nxt(int x){
find(x);
int u=rt;
if(val[u]>=x)return u;
u=rc(u);
while(lc(u))u=lc(u);
return u;
}
inline int kth(int k){
int u=rt;
if(siz[u]<k||k<=0)return -1;
while(224){
int v=lc(u);
if(siz[v]+cnt[u]<k){
k-=siz[v]+cnt[u];u=rc(u);
}
else{
if(siz[v]>=k)u=v;
else return val[u];
}
}
}
int main(){
n=read(),mn=read();insert(199999999);
for(int i=1;i<=n;i++){
scanf("%s",c);
int x=read();
if(c[0]=='I'){
if(x>=mn){
insert(x-add);num+=1;
}
}
else if(c[0]=='A'){
add+=x;
}
else if(c[0]=='S'){
add-=x;
int lv=nxt(mn-add);
splay(lv,0);
ans+=siz[lc(rt)];
num-=siz[lc(rt)];
cnt[lc(rt)]=siz[lc(rt)]=0,lc(rt)=0,siz[0]=0;
pushup(rt);
}
else{
int p=kth(num-x+1);
cout<<(p==-1?p:p+add)<<'\n';
}
//cout<<num<<'\n';
}
cout<<ans<<'\n';
}
- 厚土Go学习笔记 | 37. 图片(image)生成器
- 编写地道的Go代码
- 开发你不能忽略的问题?JavaScript(JS)
- 厚土Go学习笔记 | 36. web服务指定路径下的get参数接收与处理
- 用R进行文本分析初探——包含导入词库和和导入李白语句
- Golang事务模型
- 厚土Go学习笔记 | 35. web服务器实现动态路径
- 过滤器Filter精华知识点,怎能不看
- JavaMail开发示例,学习要看对资料
- 厚土Go学习笔记 | 34. 一个简单的 web 服务器实现
- sqlplus / as sysdba无法登录的奇怪报错 (r8笔记第36天)
- JSP与EL表达式重点学习笔记(1)
- R语言读CSV、txt文件方式以及read.table read.csv 和readr(大数据读取包)
- JSP与EL表达式重点学习笔记(2)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux部署python爬虫脚本,并设置定时任务的方法
- centos6编译及安装ZLMediaKit解析
- CentOS7.5安装配置Harbor1.7的全过程
- Linux CentOS 定时运行脚本配置的方法
- 从Centos7升级到Centos8的教程(图文详解)
- Linux(Centos7)下redis5集群搭建和使用说明详解
- CentOS7下安装yum源及上传下载命令rz、sz安装方法(图解)
- C#实例:四路激光测距雷达数据采集和波形图绘制
- Linux 中有效用户组和初始用户组的实现
- ubuntu 16.04 64位兼容32位程序三步曲
- crontab执行结果未通过发送mail通知用户的方法
- 如何将CentOS7升级至CentOS8(详细步骤)
- leetcode树之二叉树的所有路径
- 如何利用Bash脚本监控Linux的内存使用情况
- Ubuntu18 给terminal改个漂亮的命令行提示符的方法