luogu P1486 [NOI2004]郁闷的出纳员
一万年以后终于调过了这题
这道题主要是维护一个有序的集合(吧),所以使用平衡树(我这里用\(Splay\))
记录一个变量\(ff\)(雾),表示所有工资的变化量
对于\(I\)操作,如果初始工资大于等于下界\(mi\)就加进去,加进去时工资\(k\)要减去\(ff\)(我写这道题,把\(k-ff\)当成初始工资判断了,然后搞到今天才A mmp)
对于\(A\)操作,\(ff+=k\)
对于\(S\)操作,\(ff-=k\),还要考虑删点.我们可以从根出发,对于每个节点判断,小于下界\(mi\)就把左子树和自己的\(size\)加入答案,把右子树接到当前节点的父亲上去,然后删掉左子树和自己,继续处理;或者加入一个权值为\(mi-ff-1\)的点,旋到根,答案加上左子树和根节点\(size\)再-1,然后删去
最后一个操作就是平衡树第\(k\)大,不解释
略丑的代码
// luogu-judger-enable-o2
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#define LL long long
#define il inline
#define re register
using namespace std;
il LL rd()
{
re LL x=0,w=1;re char ch;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int tot=0,ans,n,mi,ff;
struct Spl
{
int rt;
Spl(){rt=0;}
struct nn
{
int ch[2],sz,fa,cs,x;
nn(){x=0,cs=1,sz=fa=ch[0]=ch[1]=0;}
}tr[110000];
void pushup(int x){tr[x].sz=tr[tr[x].ch[0]].sz+tr[tr[x].ch[1]].sz+tr[x].cs;}
void rot(int x)
{
int y=tr[x].fa,z=tr[y].fa;
int yy=(tr[y].ch[1]==x),zz=(tr[z].ch[1]==y);
tr[z].ch[zz]=x,tr[x].fa=z;
tr[y].ch[yy]=tr[x].ch[yy^1],tr[tr[x].ch[yy^1]].fa=y;
tr[x].ch[yy^1]=y,tr[y].fa=x;
pushup(y),pushup(x);
}
void spl(int x,int en)
{
while(tr[x].fa!=en)
{
int y=tr[x].fa,z=tr[y].fa;
if(z!=en) (tr[y].ch[1]==x)^(tr[z].ch[1]==y)?rot(x):rot(y);
rot(x);
}
if(!en) rt=x;
}
void inst(int x)
{
int now=rt;
while(tr[now].ch[x>tr[now].x]&&tr[now].x!=x)
now=tr[now].ch[x>tr[now].x];
if(tr[now].x==x) ++tr[now].cs;
else
{
++tot;
tr[tot].sz=1;
tr[now].ch[x>tr[now].x]=tot;
tr[tot].fa=now;
tr[tot].x=x;
now=tot;
}
spl(now,0);
}
void find(int x)
{
int now=rt;
while(tr[now].ch[x>tr[now].x]&&tr[now].x!=x)
now=tr[now].ch[x>tr[now].x];
if(now) spl(now,0);
}
int ftnt(int x,int ffa)
{
find(x);
if((tr[rt].x>x&&ffa)||(tr[rt].x<x&&!ffa)) return rt;
int now=tr[rt].ch[ffa];
while(tr[now].ch[ffa^1]) now=tr[now].ch[ffa^1];
return now;
}
void del(int x)
{
int xx=ftnt(x,0),yy=ftnt(x,1);
spl(xx,0),spl(yy,xx);
tr[yy].ch[0]=0;
pushup(yy);pushup(xx);
}
int kth(int x)
{
int now=rt;
while(1)
{
if(x<=tr[tr[now].ch[0]].sz) now=tr[now].ch[0];
else if(x>tr[tr[now].ch[0]].sz+tr[now].cs) x-=tr[tr[now].ch[0]].sz+tr[now].cs,now=tr[now].ch[1];
else return now;
}
}
il int pd(int x){return tr[tr[x].fa].ch[1]==x;}
il void work()
{
int xx=mi-ff-1;
inst(xx);
ans+=tr[tr[rt].ch[0]].sz+tr[rt].cs-1;
rt=tr[rt].ch[1];
tr[tr[rt].fa].ch[1]=-1;
tr[rt].fa=0;
}
}a;
int main()
{
a.inst(998244353);
n=rd();mi=rd();
int zz=0;
for(int i=1;i<=n;i++)
{
char cc[4];
scanf("%s",cc);
int x=rd();
if(cc[0]=='I')
{
if(x<mi) continue;
x-=ff,a.inst(x),++zz;
}
else if(cc[0]=='A') ff+=x;
else if(cc[0]=='S') ff-=x,a.work();
else x<=zz-ans?printf("%d\n",a.tr[a.kth(zz-ans-x+1)].x+ff):printf("-1\n");
}
printf("%d\n",ans);
return 0;
}
luogu P1486 [NOI2004]郁闷的出纳员的更多相关文章
- Luogu P1486 [NOI2004]郁闷的出纳员(平衡树)
P1486 [NOI2004]郁闷的出纳员 题意 题目描述 \(OIER\)公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
- P1486 [NOI2004]郁闷的出纳员
P1486 [NOI2004]郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷 ...
- 洛谷P1486 [NOI2004]郁闷的出纳员 [STL,平衡树]
题目传送门 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...
- 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】题解+AC代码
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- 洛谷P1486 [NOI2004]郁闷的出纳员(splay)
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- 洛谷 P1486 [NOI2004]郁闷的出纳员
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- 洛谷P1486 [NOI2004]郁闷的出纳员
Code: #include<cstdio> #include<algorithm> using namespace std; struct Node{ int s,val,t ...
- P1486 [NOI2004]郁闷的出纳员[权值线段树]
权值线段树. 我们只用维护一个人是否存在,以及他当前排名,而不关心工资的具体值,这个可以直接算. 不难发现,如果不考虑新的员工,所有员工的工资的差值是不变的. 而加进来一个新的员工时,其工资为\(x\ ...
- BZOJ 1503: [NOI2004]郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 10526 Solved: 3685[Submit][Stat ...
随机推荐
- C# 之抽象类和抽象方法
概述:abstract 关键字 抽象类不能被实例化,抽象方法不能有方法体,抽象类中的所有抽象方法必须在子类中重写(override ),一个抽象类可以同时包含抽象方法和非抽象方法. abstract ...
- BZOJ2822[AHOI2012]树屋阶梯——卡特兰数+高精度
题目描述 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为N+1尺(N为 ...
- python 解释器交互模块 -- sys
sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.getdefaultencoding(): 获取系统当前编码,一般默认为asci ...
- 【BZOJ4822】[CQOI2017]老C的任务(扫描线)
[BZOJ4822][CQOI2017]老C的任务(扫描线) 题面 BZOJ 洛谷 题解 没有修改操作,都不需要分治了... 直接排序之后扫描线算贡献就好了... 不知道为啥洛谷上过不了... #in ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法
我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...
- HGOI 20190303 题解
/* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...
- py3+urllib+re,轻轻松松爬取双色球最近100期中奖号码
通过页面源码,发现使用正则表达式可以很方便的获取到我们需要的数据,最后循环写入txt文件. (\d{2})表示两位数字 [\s\S]表示匹配包括“\r\n”在内的任何字符,匹配红球和蓝球之间的内容 具 ...
- luogu2178/bzoj4199 品酒大会 (SA+单调栈)
他要求的就是lcp(x,y)>=i的(x,y)的个数和a[x]*a[y]的最大值 做一下后缀和,就只要求lcp=i的了 既然lcp(x,y)=min(h[rank[x]+1],..,[h[ran ...
- CDQZ.OPENJUDGE DataStructure22
我觉得这是很重要的一些题目.它们都在这里:硕巨结构 Challenge 0:给定数列,单点修改,单点查询修改.煞有介事,不过一数组耳. Challenge 1:给定数列,单点修改,单点查询第k次操作后 ...
- Red Hat 6.3 下安装 nginx-1.7.4
一.安装准备 在Redhat系统下,没有CentOS那样使用yum安装依赖包等,所以接下来主要记录一下如何一步一步安装Nginx相关的依赖库. 下面就正式安装,由于安装Nginx需要依赖gcc-c++ ...