洛谷$P$1486 郁闷的出纳员 $[NOI2004]$ $splay$
正解:$splay$
解题报告:
依然先考虑要呲呲些什么操作鸭$QwQ$
其实就只要一个删除区间,一个查询第$k$大,还一个插入就欧克?
删除区间的话直接旋转下根什么的然后直接把子树删了就好$QwQ$
查询第$k$大和$insert$是基操不说$QwQ$
然后还一个就集体扣除工资?本来一般这种还要考虑加个$ad[]$的$tag$,,,但因为这题太水了$QwQ$所以所有$add$操作的对象都是全员鸭$QwQ$所以直接开个变量记录所有人的修改就成,然后删除区间和$insert$的值相应改点儿就好$QwQ$
$over$,,,?
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=+,inf=1e9;
int n,mm,ad,peo,as,rt,nod_cnt;
bool gdgs=;
struct node{int ch[],fa,val,cnt,sz;il void pre(ri x,ri fat){ch[]=ch[]=;fa=fat;val=x;cnt=sz=;}}tr[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il char rd(){rc ch=gc;while(ch!='I' && ch!='A' && ch!='S' && ch!='F')ch=gc;return ch;}
il void pushup(ri x){tr[x].sz=tr[tr[x].ch[]].sz+tr[tr[x].ch[]].sz+tr[x].cnt;}
il void rotate(ri x)
{
ri fa=tr[x].fa,grdfa=tr[fa].fa;bool op1=tr[fa].ch[]==x,op2=tr[grdfa].ch[]==fa;
tr[grdfa].ch[op2]=x;tr[x].fa=grdfa;
tr[fa].ch[op1]=tr[x].ch[op1^];tr[tr[x].ch[op1^]].fa=fa;
tr[fa].fa=x;tr[x].ch[op1^]=fa;
pushup(fa);pushup(x);
}
il void splay(ri x,ri goal)
{
while(tr[x].fa!=goal)
{
ri fa=tr[x].fa,grdfa=tr[fa].fa;
if(grdfa!=goal)(tr[fa].ch[]==x)^(tr[grdfa].ch[]==fa)?rotate(x):rotate(fa);
rotate(x);
}
if(!goal)rt=x;
}
il void insert(ri x)
{
ri nw=rt,fa=;
while(nw && tr[nw].val!=x)fa=nw,nw=tr[nw].ch[x>tr[nw].val];//,printf("nw=%d\n",nw);
if(nw){++tr[nw].cnt;splay(nw,);return;}
nw=++nod_cnt;if(fa)tr[fa].ch[x>tr[fa].val]=nod_cnt;tr[nw].pre(x,fa);
splay(nw,);
}
il void fd(ri x)
{
ri nw=rt;if(!nw)return;
while(tr[nw].ch[tr[nw].val<x] && tr[nw].val!=x)nw=tr[nw].ch[tr[nw].val<x];
splay(nw,);
}
il int ask_val(ri x)
{
if(x<= || tr[rt].sz<x)return --ad;
ri nw=rt;
while(gdgs)
{
if(tr[nw].cnt+tr[tr[nw].ch[]].sz<x)x-=tr[tr[nw].ch[]].sz+tr[nw].cnt,nw=tr[nw].ch[];
else if(tr[tr[nw].ch[]].sz>=x)nw=tr[nw].ch[];
else return tr[nw].val;
}
}
il int ask_lst(ri x)
{
fd(x);ri nw=tr[rt].ch[];
if(tr[rt].val>=x)return rt;
while(tr[nw].ch[])nw=tr[nw].ch[];
return nw;
}
il void delet(ri x)
{
ri nw=ask_lst(mm-ad);
splay(nw,);
as+=tr[tr[rt].ch[]].sz;peo-=tr[tr[rt].ch[]].sz;
tr[tr[rt].ch[]].sz=tr[tr[rt].ch[]].cnt=;
tr[rt].ch[]=;
tr[].sz=;
pushup(rt);
} int main()
{
n=read();mm=read();insert(inf);
while(n--)
{
rc ch=rd();ri x=read();
switch(ch)
{
case 'I':if(x>=mm)insert(x-ad),++peo;break;
case 'A':ad+=x;break;
case 'S':ad-=x;delet(mm-ad);break;
case 'F':printf("%d\n",ask_val(peo-x+)+ad);break;
}
}
printf("%d\n",as);
return ;
}
随机推荐
- hdu 2473 Junk-Mail Filter (暴力并查集)
Problem - 2473 为什么标题写的是暴力并查集?因为我的解法跟网上的有所不同,方法暴力很多. 先解释题意,这是一个模拟处理垃圾邮件的问题.垃圾邮件要根据它们的性质进行分类.对于10w个邮件, ...
- win10提示 磁盘包含不是“PARTITION_BASIC_DATA_GUID"类型的分区
在win10创建新的磁盘分区的时候,有时候会提示 磁盘包含不是"PARTITION_BASIC_DATA_GUID"类型的分区 如果你试了其他方法都不凑效,那么看看你已经有几个盘( ...
- 禁用gpu首选
import osos.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"os.environ["CUDA_VIS ...
- oracle避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空 ...
- supersocket为动态命令增加命令过滤器
由于我们无法像 C# 中一样方便的将 CLR 属性添加到 Python 文件或者函数中,因此我们需要定义一个函数 "getFilters()" 用于将命令过滤器方会给 CLR 运行 ...
- uni-app学习记录01-pages配置项
{ // 每个页面都需要在pages里面去声明配置 "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/coll ...
- 2018-8-10-VisualStudio-合并代码文件
title author date CreateTime categories VisualStudio 合并代码文件 lindexi 2018-08-10 19:16:52 +0800 2018-2 ...
- 写一个js配合rem
rem.js 目前笔者解决移动端的尺寸带来的样式问题,都是通过viewport + rem的.viewport 相信大家都用过了,而rem需要用js动态设置html的字体大小. 动态设置rem的根字体 ...
- js基础——基本包装类型
1.基本包装类型String var bz = new String("Li.Linda"); //引用类型(object) bz.name= bz.subst ...
- Mail.Ru Cup 2018 Round 2 C. Lucky Days(拓展欧几里得)
传送门 待参考资料: [1]:https://www.cnblogs.com/Patt/p/9941200.html •题意 a君,b君存在幸运周期: a君在第[ L1+k·t1,R1+k·t1]天为 ...