zoukankan      html  css  js  c++  java
  • BZOJ 1503: [NOI2004]郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 8324  Solved: 2888

    Description

    OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘了一位新员工,我就得为他新建一个工资档案。老板经常到我这边来询问工资情况,他并不问具体某位员工的工资情况,而是问现在工资第k多的员工拿多少工资。每当这时,我就不得不对数万个员工进行一次漫长的排序,然后告诉他答案。好了,现在你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样,不是很困难吧?

    Input

    Output

    输出文件的行数为F命令的条数加一。对于每条F命令,你的程序要输出一行,仅包含一个整数,为当前工资第k多的员工所拿的工资数,如果k大于目前员工的数目,则输出-1。输出文件的最后一行包含一个整数,为离开公司的员工的总数。

    Sample Input

    9 10
    I 60
    I 70
    S 50
    F 2
    I 30
    S 15
    A 5
    F 1
    F 2

    Sample Output

    10
    20
    -1
    2

    HINT

    I命令的条数不超过100000 A命令和S命令的总条数不超过100 F命令的条数不超过100000 每次工资调整的调整量不超过1000 新员工的工资不超过100000

    Source

    Splay

    解题:Splay

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 const int INF = 0x3f3f3f3f;
      4 const int maxn = 100010;
      5 int delta;
      6 struct splayTree {
      7     int val[maxn],fa[maxn],ch[maxn][2],sz[maxn];
      8     int root,tot;
      9     inline void pushup(int x) {
     10         sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1;
     11     }
     12     void newnode(int &x,int key,int f) {
     13         val[x = ++tot] = key;
     14         fa[x] = f;
     15         ch[x][0] = ch[x][1] = 0;
     16         sz[x] = 1;
     17     }
     18     void init() {
     19         ch[0][0] = ch[0][1] = tot = 0;
     20         sz[0] = 0;
     21     }
     22     void rotate(int x,int kd) {
     23         int y = fa[x];
     24         ch[y][kd^1] = ch[x][kd];
     25         fa[ch[x][kd]] = y;
     26         fa[x] = fa[y];
     27         fa[y] = x;
     28         ch[x][kd] = y;
     29         if(fa[x]) ch[fa[x]][y == ch[fa[x]][1]] = x;
     30         pushup(y);
     31     }
     32     void Splay(int x,int goal) {
     33         while(fa[x] != goal) {
     34             if(fa[fa[x]] == goal) rotate(x,x == ch[fa[x]][0]);
     35             else {
     36                 int y = fa[x],z = fa[y],s = (y == ch[z][0]);
     37                 if(x == ch[y][s]) {
     38                     rotate(x,!s);
     39                     rotate(x,s);
     40                 } else {
     41                     rotate(y,s);
     42                     rotate(x,s);
     43                 }
     44             }
     45         }
     46         pushup(x);
     47         if(!goal) root = x;
     48     }
     49     void insert(int key) {
     50         if(!root) {
     51             newnode(root,key,0);
     52             return;
     53         }
     54         int x = root;
     55         while(ch[x][val[x] < key]) {
     56             sz[x]++;
     57             x = ch[x][val[x] < key];
     58         }
     59         newnode(ch[x][val[x] < key],key,x);
     60         Splay(tot,0);
     61     }
     62     void deleteSub(int key){
     63         int x = root,xx = 0;
     64         while(x){
     65             if(val[x] < key){
     66                 xx = x;
     67                 x = ch[x][1];
     68             }else x = ch[x][0];
     69         }
     70         if(!xx) return;
     71         Splay(xx,0);
     72         if(!ch[xx][1]) root = 0;
     73         else fa[root = ch[xx][1]] = 0;
     74     }
     75     void kth(int k){
     76         int x = root;
     77         if(k < 1) {
     78             puts("-1");
     79             return;
     80         }
     81         while(ch[x][0] || ch[x][1]){
     82             if(k == sz[ch[x][0]] + 1) break;
     83             if(k < sz[ch[x][0]] + 1) x = ch[x][0];
     84             else{
     85                 k -= sz[ch[x][0]] + 1;
     86                 x = ch[x][1];
     87             }
     88         }
     89         printf("%d
    ",val[x] + delta);
     90     }
     91 } spt;
     92 int main() {
     93     int n,m,tmp,ret = 0,cnt = 0;
     94     char op[10];
     95     scanf("%d%d",&n,&m);
     96     spt.init();
     97     while(n--){
     98         scanf("%s%d",op,&tmp);
     99         if(op[0] == 'I' && tmp >= m){
    100             ++cnt;
    101             spt.insert(tmp - delta);
    102         }else if(op[0] == 'A') delta += tmp;
    103         else if(op[0] == 'S'){
    104             delta -= tmp;
    105             spt.deleteSub(m - delta);
    106         }else if(op[0] == 'F')
    107             spt.kth(spt.sz[spt.root] - tmp + 1);
    108     }
    109     printf("%d
    ",cnt - spt.sz[spt.root]);
    110     return 0;
    111 }
    View Code
  • 相关阅读:
    nyoj 230/poj 2513 彩色棒 并查集+字典树+欧拉回路
    nyoj 211 Cow Contest
    nyoj 203 三国志 dijkstra+01背包
    nyoj 170 网络的可靠性
    nyoj 120 校园网络
    nyoj 115 城市平乱 dijkstra最短路
    nyoj 42 一笔画问题 欧拉路径
    nyoj 38 布线问题
    hdu 2089 不要62--数位dp入门
    nyoj 712 探 寻 宝 藏--最小费用最大流
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4864401.html
Copyright © 2011-2022 走看看