题目


分析

考虑加减工资直接打标记,查询第\(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]郁闷的出纳员的更多相关文章

  1. 洛谷.1486.[NOI2004]郁闷的出纳员(Splay)

    题目链接 /* BZOJ1503: 3164kb 792ms/824ms(新建节点) 洛谷 : 3.06mb 320ms/308ms(前一个要慢wtf 其实都差不多,但前者好写) 四种操作: A:所有 ...

  2. 洛谷P1486 [NOI2004]郁闷的出纳员 [STL,平衡树]

    题目传送门 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...

  3. 洛谷P1486 [NOI2004]郁闷的出纳员(splay)

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

  4. 洛谷 P1486 [NOI2004]郁闷的出纳员

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

  5. 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】题解+AC代码

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

  6. 洛谷P1486 [NOI2004]郁闷的出纳员

    Code: #include<cstdio> #include<algorithm> using namespace std; struct Node{ int s,val,t ...

  7. 【洛谷P1486】郁闷的出纳员

    题目大意:维护一个平衡树,支持插入一个数,删除小于一个值的所有数,K 大值查询,每个节点权值加减一个数. 题解:所有节点权值加减操作可以考虑直接维护一个全局标记,删除小于一个值的所有数字为一个二分的过 ...

  8. 洛谷 1486/BZOJ 1503 郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13866  Solved: 5069[Submit][Stat ...

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

    1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...

  10. BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】

    一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题. 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点 ...

随机推荐

  1. 02、etcd单机部署和集群部署

    上一章我们认识了etcd,简单的介绍了 etcd 的基础概念,但是理解起来还是比较抽象的.这一章我们就一起来部署下 etcd .这样可以让我们对 etcd 有更加确切的认识. 1.etcd单实例部署 ...

  2. docker-compose 安装gitlab

    准备docker-compose.yml version: '3.6' services: web: image: 'registry.gitlab.cn/omnibus/gitlab-jh:16.7 ...

  3. 【Azure Fabric Service】怎样关闭 Azure Service Fabric?

    问题描述 怎样关闭Azure Service Fabric服务呢?在Azure门户上没有找到 Stop 按钮. 问题回答 Azure Service Fabric 默认是无法停止的,可以删除. 虽然可 ...

  4. BeanShell Sampler 前置处理器

    一概念: 前置处理器主要作用: 用于修改即将发送的http的请求数据 BeanShell预处理器可以在取样器发送请求之前被执行,可以通过它完成发送请求所需的数据 其中的ctx.vars.props.p ...

  5. 5、zookeeper应用场景-配置中心原理

    配置中心 使用 zookeeper的特性watcher监听器 工作中有这样的一个场景:数据库用户名和密码信息放在一个配置文件中,应用读取该配置文件,配置文件信息放入缓存 若数据库的用户名和密码改变时候 ...

  6. 速存,详细罗列香橙派AIpro外设接口样例大全(附源码)

    本文分享自华为云社区<香橙派AIpro外设接口样例大全(附源码)>,作者:昇腾CANN. Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇 ...

  7. 复习精简版快速学vue3

    vue2中.如果给一个之前没有定义的属性赋值,会得不到时实更新: this.obj.b=2 //由于这个属性之前没有定义,是不支持动态响应,只能用this.$(this.obj,'b',2)也就是说v ...

  8. 软件架构(四)单体架构(Monolithic Architecture)

    系列目录 软件架构(一)概览 软件架构(二)编程语言的历史 软件架构(三)名词解释:架构.设计.风格.模式 软件架构(四)单体架构(Monolithic Architecture) 软件架构(五)分层 ...

  9. 聊聊Web项目中的权限设计

    一般的Web项目中都少不了登录这个环节,登录之后就需要跳转到首页,并且根据 当前用户的信息,获取到对应的菜单信息,可以操作的方法信息等等.这个只是针对于 操作权限,至于数据权限处理起来会更加复杂一些. ...

  10. 回声消除(Acoustic Echo Cancellation)中遇到的几个常见问题思考

    什么才是好的回声消除效果   个人的理解:好的回声消除算法,要满足两个条件:一个是回声确实被消除了,另外一个是麦克风采集到音频信号不能被消除,常见的就是人的声音信号.这个算法只是提供了一种方法,具体的 ...