权值分块,离散化非常蛋疼,只能离散化搞……

需要支持操作:删除<=某个值得所有权值==打标记 O(sqrt(n))

码长和我的平衡树差不多……速度快3倍左右。

 #include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 201001
struct Point{int v,p;}tmp[N];
bool operator < (const Point &a,const Point &b){return a.v<b.v;}
int n,m,Infu,a[N],c[N],leave,
en/*插入的权值数*/,en2/*离散化之后的权值种类数*/,ma[N];
char op[N];
int num[N],l[],CH[],r[],Num,sumv[],sum,sz,b[N],all;
bool delta[N];
inline void R(int &x){
char c=;int f=;
for(;c<''||c>'';c=getchar())if(c=='-')f=-;
for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
x*=f;
}
inline void P(int x)
{
if(!x){putchar('');puts("");return;}
if(x<){putchar('-');x=-x;}Num=;
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);puts("");
}
void makeblock()
{
sz=sqrt(en2); if(!sz) sz=;
for(sum=;sum*sz<en2;sum++)
{
l[sum]=r[sum-]+;
r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
l[sum]=r[sum-]+;
r[sum]=en2;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
void pushdown(const int &p)
{
if(delta[p])
{
for(int i=l[p];i<=r[p];i++) b[i]=;
delta[p]=;
}
}
inline void Insert(const int &x){pushdown(num[x]); b[x]++; sumv[num[x]]++; all++;}
inline void Delete(const int &v)//删除小于等于v的所有权值
{
int used=all; pushdown(num[v]);
for(int i=v;i>=l[num[v]];i--)
{
sumv[num[i]]-=b[i];
all-=b[i];
b[i]=;
}
for(int i=num[v]-;i>=;i--) if(sumv[i])
{
delta[i]=;
all-=sumv[i];
sumv[i]=;
} leave+=(used-all);
}
inline int Kth(const int &x)
{
int cnt=;
for(int i=sum;;i--)
{
cnt+=sumv[i];
if(cnt>=x)
{
cnt-=sumv[i];
for(int j=r[i];;j--)
{cnt+=b[j]; if(cnt>=x) return j;}
}
}
}
int main()
{
R(n); R(m);
for(int i=;i<=n;i++)
{
op[i]=getchar(); R(a[i]);
if(op[i]=='I')
{
tmp[++en].v=a[i]-Infu;//为新员工消除之前工资变化的影响
tmp[en].p=en;
}
else if(op[i]=='A') Infu+=a[i];
else if(op[i]=='S')
{
Infu-=a[i];
tmp[++en].v=m-Infu-;//每次删除<=m-Infu-1的权值
tmp[en].p=en;
}
}
sort(tmp+,tmp+en+);
ma[c[tmp[].p]=++en2]=tmp[].v;
for(int i=;i<=en;i++)
{
if(tmp[i].v!=tmp[i-].v) en2++;
ma[c[tmp[i].p]=en2]=tmp[i].v;
} Infu=en=; makeblock();
for(int i=;i<=n;i++)
{
if(op[i]=='I') {en++; if(a[i]>=m) Insert(c[en]);}
else if(op[i]=='A') Infu+=a[i];
else if(op[i]=='S')
{
Infu-=a[i];
Delete(c[++en]);
}
else
{
if(a[i]>all) puts("-1");
else P(ma[Kth(a[i])]+Infu);
}
} P(leave);
return ;
}

【权值分块】bzoj1503 [NOI2004]郁闷的出纳员的更多相关文章

  1. [BZOJ1503][NOI2004]郁闷的出纳员

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

  2. bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 8705  Solved: 3027[Submit][Statu ...

  3. [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  4. bzoj1503: [NOI2004]郁闷的出纳员(伸展树)

    1503: [NOI2004]郁闷的出纳员 题目:传送门 题解: 修改操作一共不超过100 直接暴力在伸展树上修改 代码: #include<cstdio> #include<cst ...

  5. 题解【bzoj1503 [NOI2004]郁闷的出纳员】

    Description 给出一个下限 \(m\) ,要求维护以下操作 插入一个数(如果小于下限就不加) 给每个数加上一个数 给每个数减去一个数,并且删除掉 \(< m\) 的所有数 求目前第 \ ...

  6. [BZOJ1503] [NOI2004] 郁闷的出纳员 (treap)

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

  7. BZOJ1503[NOI2004]郁闷的出纳员——treap

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

  8. [luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】

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

  9. 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)

    bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...

随机推荐

  1. 从零开始学习MXnet(三)之Model和Module

    在我们在MXnet中定义好symbol.写好dataiter并且准备好data之后,就可以开开心的去训练了.一般训练一个网络有两种常用的策略,基于model的和基于module的.今天,我想谈一谈他们 ...

  2. IOI1998 Polygon [区间dp]

    [IOI1998]Polygon 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘 ...

  3. IDEA2017 使用(二)

    1.鼠标悬浮在方法上显示api 2.关闭拼写检查 3.自动导入包(存在多个包时需要手动导入) 4.设置方法线

  4. jquery中:input和input的区别

    :input表示选择表单中的input,select,textarea,button元素, input仅仅选择input元素. <button>和<input type=" ...

  5. Linux引导过程

    早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...

  6. openstack 问题澄清

    1. neutron中plugin与agent是一一对应的吗? 在不使用ml2时,plugin与agent一一对应,如ovs-plugin与ovs-agent:当使用ml2 plugin时,该plug ...

  7. NYOJ 170 网络的可靠性 (数学)

    题目链接 描述 A公司是全球依靠的互联网解决方案提供商,也是2010年世博会的高级赞助商.它将提供先进的网络协作技术,展示其"智能+互联"的生活概念,同时为参观者提供高品质的个人体 ...

  8. 【bzoj4282】慎二的随机数列

    扯几句题外的,最近在看Fate/StayNight,对此人毫无好感…… 每次减一下当前可辨认数,然后随意dp一个LIS,最后记得加回去就好. #include<bits/stdc++.h> ...

  9. [ Python - 3 ] python3.5中不同的读写模式

    r 只能读.r+可读可写,不会创建不存在的文件.如果直接写文件,则从顶部开始写,覆盖之前此位置的内容,如果先读后写,则会在文件最后追加内容.w+ 可读可写 如果文件存在 则覆盖整个文件不存在则创建w ...

  10. jquery 操作dom效率测试------html和append插入文档

    $(function () { var htmlResult = createHtmlContent(100); console.log(htmlResult) insertHtml.call($(& ...