AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1503

【我的感受】

这题郁闷了很久,因为discuss里讨论的问题和我都不是一个问题...

discuss里的当然是一大坑点啦,就是初始工资挂了的不算在最后踢出的人数中。

不过这个我倒是刚开始就这么打的...不过我一直超时啊超时啊...

终于要来了数据...额,原来是平衡树的性质都没怎么用...根本没转几次啊,然后数据就特意卡了这个,连续添加递增工资的人[变成了链]

那我就随机转一转好了,然后不知道为什么不能srand(time(0)),反正这样就会RE,于是干脆不加随机种子了,终于搞定了...

【分析】

这题我的思路大概是这样的:

1.因为不管是加工资还是减工资还是加成员还是问第k大,都和数据的数值有关而与顺序无关,于是按数值大小建立二叉树

2.这题和平常做的+tag的题只有一种区别,就是删除和减工资一起执行了。于是需要将会被删掉的人事先找出来,即 工资<最低工资+扣减工资 的人,这当然是一颗子树啦,删掉就好。

3.其它的操作就和之前的一样了,因为每次的增工资和减工资都是对所有人进行,所以相对大小不会变,下次如果将区间增加值...那就麻烦大了[怎么做呢?我自然是想不到了...]

#include<cstdio>
#include<ctime>
#include<cstring>
#include<cstdlib>
#include<algorithm>using namespace std;inline int in(){int x=0;char ch=getchar();while(ch>'9' || ch<'0') ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x;
}const int maxn=100010;struct Node{int f,ch[2];int sz,ct;int dt,pt;
}s[maxn];int m,Min,n,rt;void push_down(int x){if(!s[x].pt) return;if(s[x].ch[0]) s[s[x].ch[0]].dt+=s[x].pt,s[s[x].ch[0]].pt+=s[x].pt;if(s[x].ch[1]) s[s[x].ch[1]].dt+=s[x].pt,s[s[x].ch[1]].pt+=s[x].pt;s[x].pt=0;
}void update(int x){s[x].sz=s[s[x].ch[0]].sz+s[s[x].ch[1]].sz+s[x].ct;
}int Find(int k){int p=rt;if(s[rt].sz<k || k<=0) return -1;while(p){push_down(p);if(k<=s[s[p].ch[0]].sz) p=s[p].ch[0];else{k-=s[s[p].ch[0]].sz;if(k<=s[p].ct) return p;k-=s[p].ct;p=s[p].ch[1];}}
}void Rotate(int x,int k){int y=s[x].f;s[x].f=s[y].f;if(s[y].f){if(s[s[y].f].ch[0]==y) s[s[y].f].ch[0]=x;else s[s[y].f].ch[1]=x;}s[y].ch[k]=s[x].ch[k^1];if(s[x].ch[k^1]) s[s[x].ch[k^1]].f=y;s[y].f=x,s[x].ch[k^1]=y;update(y),update(x);
}void Splay(int x,int gf){int y;while(s[x].f!=gf){y=s[x].f;if(s[y].f==gf){if(x==s[y].ch[0]) Rotate(x,0); else Rotate(x,1);}else{int z=s[y].f;if(y==s[z].ch[0]){if(x==s[y].ch[0]) Rotate(y,0),Rotate(x,0);else Rotate(x,1),Rotate(x,0);}else{if(x==s[y].ch[1]) Rotate(y,1),Rotate(x,1);else Rotate(x,0),Rotate(x,1);}}}if(!gf) rt=x;
}void Insert(int x){if(x<Min) return;if(!rt){s[++n].dt=x;s[n].sz=1;rt=n,s[n].ct=1;return;}int p=rt;while(p){s[p].sz++;push_down(p);if(s[p].dt<x){if(s[p].ch[1]) p=s[p].ch[1];else{s[p].ch[1]=++n,s[n].dt=x,s[n].sz=1,s[n].f=p,s[n].ct=1;break;}}else if(s[p].dt>x){if(s[p].ch[0]) p=s[p].ch[0];else{s[p].ch[0]=++n,s[n].dt=x,s[n].sz=1,s[n].f=p,s[n].ct=1;break;}}else{n++;s[p].ct++;return;}}if(rand()%100>80) Splay(n,0);
}void Addition(int x){s[rt].dt+=x,s[rt].pt+=x;
}void Shorten(int x){int p=rt,bye=Min+x,rec=-1;while(p){push_down(p);if(s[p].dt<bye)rec=p,p=s[p].ch[1];elsep=s[p].ch[0];}if(rec!=-1){Splay(rec,0);rt=s[rec].ch[1],s[rt].f=0;if(rt) update(rt);}if(rt) s[rt].dt-=x,s[rt].pt-=x;
}int Get_kth(int k){int x=Find(s[rt].sz-k+1);if(x<0) return -1;if(rand()%100>80) Splay(x,0);return s[x].dt;
}int main(){
#ifndef ONLINE_JUDGEfreopen("1503.in","r",stdin);freopen("1503.out","w",stdout);
#endifint k;char ord[2];scanf("%d%d",&m,&Min);while(m--){scanf("%s",ord);k=in();if(ord[0]=='I') Insert(k);else if(ord[0]=='A') Addition(k);else if(ord[0]=='S') Shorten(k);else if(ord[0]=='F') printf("%d\n",Get_kth(k));}printf("%d",n-s[rt].sz);return 0;
}

View Code

转载于:https://www.cnblogs.com/Robert-Yuan/p/5089930.html

BZOJ1503 [NOI2004]郁闷的出纳员相关推荐

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

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

  2. bzoj1503: [NOI2004]郁闷的出纳员

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题目: 1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  ...

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

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

  4. [题解]bzoj1503(NOI2004)郁闷的出纳员

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

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

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

  6. 【权值分块】bzoj1503 [NOI2004]郁闷的出纳员

    权值分块,离散化非常蛋疼,只能离散化搞-- 需要支持操作:删除<=某个值得所有权值==打标记 O(sqrt(n)) 码长和我的平衡树差不多--速度快3倍左右. 1 #include<cst ...

  7. 【BZOJ1503】郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 11250  Solved: 3962 [Submit][St ...

  8. 洛谷P1486 [NOI2004] 郁闷的出纳员 题解

    P1486 [NOI2004] 郁闷的出纳员 题目链接:P1486 [NOI2004] 郁闷的出纳员 题意:维护一个数据结构,支持 插入一个大小为 kkk​ 的值,小于下界时不插入 所有元素加上 kk ...

  9. BZOJ1503:[NOI2004]郁闷的出纳员——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题面复制的洛谷的,因为洛谷好看) 题目描述 OIER公司是一家大型专业化软件公司,有着数以万 ...

最新文章

  1. FPGA之道(65)代码中的约束信息(二)乘法器的相关约束
  2. 《JAVA程序设计》_第四周学习总结
  3. mysql split 按 分割_mysql分割字符串split
  4. 安卓学习笔记06:Activity生命周期与启动模式
  5. IT职场人生系列之二十:危险职业(续1)
  6. 360大牛解读PHP面试-高并发解决方案类考察点
  7. Mac系统 wps/word和endnote关联,导入参考文献
  8. css 手型 没生效,css各种手型集合(css禁止手型)(示例代码)
  9. 柳州汇商大湾区双招双引 谋定·大健康医药:李喜贵被聘顾问
  10. Unity 内置着色器下载方法
  11. 180522 安卓-DDCTF2018(RSA)
  12. 受壁虎启发,材料公司Felsuma研发一种能黏在任何材质表面的“壁虎皮肤”
  13. 达尔文流媒体服务器搭配
  14. 机器学习之K-Means
  15. 小黄豆CRM v1.17版本发布
  16. 如何查看自己电脑的型号
  17. android rootfs_android.img,进度栏和Rootfsimg自动更新还应该解决了一些兼容性问题
  18. 爱立信携手EBU和BBC展示直播字幕制作的新标准
  19. Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
  20. 为什么谐振时电抗为0_如何正确选择串联电抗器

热门文章

  1. 用筛法求之N内的素数。(N 1000000)
  2. Android工程目录
  3. Android Audio代码分析7 - stream type
  4. 很久没有更新blog了,对不起每一位朋友。
  5. CakePHP中文手册【翻译】-请求处理组件
  6. C++实现求数组中前K大的数
  7. 两个摄像头是如何将照片拼接在一起的
  8. 【原创】用MySQL 生成随机密码-增加大写处理
  9. PHP性能调优,PHP慢日志---PHP脚本执行效率性能检测之WebGrind的使用
  10. 在直播问题上,智能电视们不应该沉默