【权值分块】bzoj1503 [NOI2004]郁闷的出纳员
权值分块,离散化非常蛋疼,只能离散化搞……
需要支持操作:删除<=某个值得所有权值==打标记 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]郁闷的出纳员的更多相关文章
- [BZOJ1503][NOI2004]郁闷的出纳员
[BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 8705 Solved: 3027[Submit][Statu ...
- [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- bzoj1503: [NOI2004]郁闷的出纳员(伸展树)
1503: [NOI2004]郁闷的出纳员 题目:传送门 题解: 修改操作一共不超过100 直接暴力在伸展树上修改 代码: #include<cstdio> #include<cst ...
- 题解【bzoj1503 [NOI2004]郁闷的出纳员】
Description 给出一个下限 \(m\) ,要求维护以下操作 插入一个数(如果小于下限就不加) 给每个数加上一个数 给每个数减去一个数,并且删除掉 \(< m\) 的所有数 求目前第 \ ...
- [BZOJ1503] [NOI2004] 郁闷的出纳员 (treap)
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- BZOJ1503[NOI2004]郁闷的出纳员——treap
OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心 ...
- [luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)
bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...
随机推荐
- Mysql History list length 值太大引起的问题
1. 环境 Mysql 主从 Mysql版本:5.1.49-log 系统:Red Hat Enterprise Linux Server release 5.4 64bit 2. 表面现象 数据库操 ...
- HDU 5670
Machine Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 在Maven中怎么配置外部Jar
转摘自:http://liugang594.iteye.com/blog/1677712 假设我们有一个Maven的project,其中有些Jar包不是来自Maven库的,是存在本地的某些Jar文件, ...
- css划斜线
http://stackoverflow.com/questions/18012420/draw-diagonal-lines-in-div-background-with-css
- sender的作用
https://www.evernote.com/shard/s227/sh/c2441a07-6b7e-4659-8452-9f768ee9cc66/73a115ed352421e10629 ...
- 【洛谷 SP2878】Knights of the Round Table(双联通分量)
先放这吧,没时间写,明天再补 "明天到了" 题目链接 题意:求不在任何奇环内的点的数量. Tarjan求点双联通分量,然后再染色判断是不是二分图就好了. 只是不懂为什么Tarjan ...
- 单源最短路模板_SPFA_Dijkstra(堆优化)_C++
随手一打就是标准的SPFA,默认1号节点为出发点,当然不用 f 判断是否在队里也可以,只是这样更优化一点 void spfa() { int i,x,k; ;i<=n;i++) { d[i]=o ...
- 也说JS脚本加载控制
问题背景 前端采用的 iframe + html 做后台管理系统.现在js.jquery插件非常多,每次页面都是引用就类似这样: <script src="../Scripts/jqu ...
- HDU1010(dfs+剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- nginx、apache、tomcat的区别
1.Apache Apache支持模块化,性能稳定,Apache本身是静态解析,适合静态HTML.图片等,但可以通过扩展脚本.模块等支持动态页面等. 缺点:配置相对复杂,自身不支持动态页面. 2.To ...