首页 > 其他 > 详细

[NOI2004]郁闷的出纳员

时间:2018-11-08 21:46:14      阅读:179      评论:0      收藏:0      [点我收藏+]

正解:$Treap/Splay/$各种$BST$
而且是裸题……
但是……
颓废蒟蒻如我连裸题都懒得不会打$qwq$
但是这道题有一个十分弱智妙的特点:每次更改工资下界是针对全员更改的,而非指定范围。
而$stl$中的$vector$容器可以利用内存块的移动实现$O(1)$在任意位置插入元素……
然后就可以使用$lower$_$bound$$A$掉这道题啦$qwq$

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <vector>
 5 using namespace std;
 6 vector<int> vec;
 7 
 8 inline int read() {
 9     int res = 0, flag = 1;
10     char c = getchar();
11     for(; !isdigit(c); c = getchar()) if(c == -) flag = -1;
12     for(; isdigit(c); c = getchar()) res = (res<<3) + (res<<1) + (c^48);
13     return res * flag;
14 }
15 
16 int main() {
17     int n = read(), least = read(), ans = 0;
18     for(int i = 1; i <= n; i++) {
19         char opt = getchar();
20         int k = read();
21         if(opt == I) {
22             if(k < least) continue;
23             vec.insert(lower_bound(vec.begin(), vec.end(), k), k);
24         }
25         else if(opt == A) for(int i = 0; i < vec.size(); i++) vec[i] += k;
26         else if(opt == S) {
27             int size = vec.size();
28             for(int i = 0; i < size; i++) {
29                 vec[i] -= k;
30                 if(vec[i] < least)
31                     vec.erase(lower_bound(vec.begin(), vec.end(), vec[i])), ans++, size--, i--;
32             }
33         }
34         else {
35             if(k > vec.size()) printf("-1\n");
36             else printf("%d\n", vec[vec.size() - k]);
37         }
38     }
39     printf("%d\n", ans);
40     return 0;
41 }

 

[NOI2004]郁闷的出纳员

原文:https://www.cnblogs.com/Zenurik/p/9931977.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!