LOJ10145郁闷的出纳员
传送门:https://loj.ac/problem/10145
简单的平衡树
————————————————————————————————————
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10;
4 int n,minv,lk;
5 struct node
6 {
7 int val,lc,rc,siz,rd,delt;
8 }tr[maxn];
9 int cnt,root;
10 int newnode(int v)
11 {
12 tr[++cnt].val=v;
13 tr[cnt].lc=tr[cnt].rc=0;
14 tr[cnt].siz=1;
15 tr[cnt].rd=rand();
16 tr[cnt].delt=0;
17 return cnt;
18 }
19 void update(int cur)
20 {
21 tr[cur].siz=tr[tr[cur].lc].siz+tr[tr[cur].rc].siz+1;
22 }
23 void down(int cur)
24 {
25 if(!cur)return ;
26 if(tr[cur].delt)
27 {
28 tr[tr[cur].lc].val+=tr[cur].delt;
29 tr[tr[cur].rc].val+=tr[cur].delt;
30 tr[tr[cur].lc].delt+=tr[cur].delt;
31 tr[tr[cur].rc].delt+=tr[cur].delt;
32 tr[cur].delt=0;
33 }
34 }
35 int merge(int x,int y)
36 {
37 if(x*y==0)return x+y;
38 if(tr[x].rd<tr[y].rd)
39 {
40 down(x);
41 tr[x].rc=merge(tr[x].rc,y);
42 update(x);
43 return x;
44 }
45 else
46 {
47 down(y);
48 tr[y].lc=merge(x,tr[y].lc);
49 update(y);
50 return y;
51 }
52 }
53 void splitm(int cur,int v,int &x,int &y)
54 {
55 if(!cur)x=y=0;
56 else
57 {
58 if(tr[tr[cur].lc].siz+1<=v)
59 {
60 down(cur);
61 x=cur;
62 splitm(tr[cur].rc,v-tr[tr[cur].lc].siz-1,tr[cur].rc,y);
63 }
64 else
65 {
66 down(cur);
67 y=cur;
68 splitm(tr[cur].lc,v,x,tr[cur].lc);
69 }
70 update(cur);
71 }
72 }
73 void splitv(int cur,int v,int &x,int &y)
74 {
75 if(!cur)x=y=0;
76 else
77 {
78 down(cur);
79 if(tr[cur].val<=v)
80 {
81 x=cur;
82 splitv(tr[cur].rc,v,tr[cur].rc,y);
83 }
84 else
85 {
86 y=cur;
87 splitv(tr[cur].lc,v,x,tr[cur].lc);
88 }
89 update(cur);
90 }
91 }
92
93 char s[3];
94 void insert(int v)
95 {
96 if(v<minv)
97 {
98 return ;
99 }
100 int x,y;
101 splitv(root,v,x,y);
102 root=merge(merge(x,newnode(v)),y);
103 }
104 void add(int v)
105 {
106 tr[root].val+=v;
107 tr[root].delt+=v;
108 int x,y;
109 if(v<0)
110 {
111 splitv(root,minv-1,x,y);
112 lk+=tr[x].siz;
113 root=y;
114 }
115 }
116 int kth(int cur,int k)
117 {
118 while(cur)
119 {
120 down(cur);
121 if(tr[tr[cur].lc].siz+1==k)return tr[cur].val;
122 else if(tr[tr[cur].lc].siz>=k)cur=tr[cur].lc;
123 else
124 {
125 k-=tr[tr[cur].lc].siz+1;
126 cur=tr[cur].rc;
127 }
128 }
129 }
130 void find(int v)
131 {
132 if(!root || tr[root].siz<v || v<=0)
133 {
134 puts("-1");
135 return ;
136 }
137 int x,y;
138 splitm(root,v-1,x,y);
139 printf("%d\n",kth(y,1));
140 root=merge(x,y);
141 }
142 int main()
143 {
144 scanf("%d%d",&n,&minv);
145 for(int x,i=0;i<n;++i)
146 {
147 scanf("%s%d",s,&x);
148 if(s[0]=='I')insert(x);
149 else if(s[0]=='A')add(x);
150 else if(s[0]=='S')add(-x);
151 else find(tr[root].siz-x+1);
152 }
153 printf("%d\n",lk);
154 return 0;
155 }
LOJ10145郁闷的出纳员的更多相关文章
- BZOJ 1503: [NOI2004]郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 10526 Solved: 3685[Submit][Stat ...
- [BZOJ1503][NOI2004]郁闷的出纳员
[BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...
- BZOJ 1503: [NOI2004]郁闷的出纳员 splay
1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
- c++之路进阶——codevs1286(郁闷的出纳员)
1286 郁闷的出纳员 2004年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description OIER公司 ...
- 【BZOJ】【1503】 【NOI2004】郁闷的出纳员
Splay Splay的模板题吧……妥妥的序列操作= =(好像有段时间没写过这种纯数据结构题了……) /************************************************ ...
- bzoj 1503: [NOI2004]郁闷的出纳员 Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 6263 Solved: 2190[Submit][Statu ...
- 数据结构(跳跃表):NOI 2004 郁闷的出纳员
郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 8705 Solved: 3027[Submit][Statu ...
- NOI2004 郁闷的出纳员 Splay
郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...
随机推荐
- spring mvc与mybatis事务整合
之前公司用的是mybatis,但事务管理这块是用ejb的CMT容器管理的事务.基本原理是ejb请求进来,业务代码会创建一个mybatis的session然后放入当前线程,之后所有的方法操作涉及到数据库 ...
- [LeetCode]160. Intersection of Two Linked Lists判断交叉链表的交点
方法要记住,和判断是不是交叉链表不一样 方法是将两条链表的路径合并,两个指针分别从a和b走不同路线会在交点处相遇 public ListNode getIntersectionNode(ListNod ...
- 在ubuntu上利用科大讯飞的SDK实现语音识别-语义识别等功能
首先,参考科大讯飞的官方sdk中的案例,实现和机器的日常对话和控制. 具体步骤: 1. 通过麦克风捕获说话的声音,然后通过在线语音识别获取语音中的字符. 2. 将获取到的字符上传到科大讯飞的语义识别中 ...
- JavaSwing 船只停靠管理可视化(四)
JavaSwing 船只停靠管理可视化(一) JavaSwing 船只停靠管理可视化(二) JavaSwing 船只停靠管理可视化(三) JavaSwing 船只停靠管理可视化(四) JavaSwin ...
- JAVE JDK安装步骤
1.安装JDK 选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java文件夹的根目 ...
- fatal error C1045: 编译器限制 : 链接规范嵌套太深
前言 我相信你是遇到了同样的问题.通过搜索引擎来到这里的.为了不耽误排查问题的时间,我提前说明一下这篇文章所描述的问题范畴: 我遇到的问题和 c++ 模板相关: 如果我减少传递的参数的话,是有可能避免 ...
- Java高并发与多线程(一)-----概念
其实之前一直想专门写一篇,单独说一说Java的多线程与高并发,但是一直以来,都没有想到能够用什么比较有趣的表现形式去表达出来,而且网上充斥着很多类似的博客,有好的又不好的,有简介的有繁琐的,所以也一直 ...
- Java 中 Executors.newSingleThreadExecutor() 与Executors.newFixedThreadPool(1)有什么区别
在研究Executors提供的线程池时自然会想到标题这个问题,既然已经有了newFixedThreadPool,为什么还要存在newSingleThreadExecutor这个方法.难道newFixe ...
- 解决surfacebook无法运行64位虚拟机的问题
如果您嫌烦请直接看英文部分解决方案,另外windows专业版内置的hyper-v也是一款及其好用的虚拟机. 网上各种方案都尝试过,但是每次使用VMware创建64为虚拟机的时候总会显示不支持64位虚拟 ...
- ORA-39700: database must be opened with UPGRADE option【转】
1. 错误 数据库升级后(从11.2.0.1升级到11.2.0.4)启动报错 SQL> startup ORACLE instance started. Total System Globa ...