郁闷的出纳员

思路:

  设工资下限为ko,然后ko--(因为要小于工资下限);

  设cur为记录工资增长,降低;

  设第i个人的工资为pos;

  对应的四种操作:

    插入:cur-pos-ko;

    增长:cur-=pos;

    降低:cur+=pos;

      每个降低操作都要进行一次删除节点;

      把小于等于cur的节点全部删掉;

    排名:输出rank()-cur+ko;

  splay支持以上全部操作;

  还有一点,如果一开始这个人的工资小于ko,则不算在离去的人里;

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 1000005 struct TreeNodeType {
int w,key,opi,size,ch[]; void destroy()
{
w=key=opi=size=ch[]=ch[]=;
} void create(int x)
{
key=x;
w=size=;
opi=ch[]=ch[]=;
}
};
struct TreeNodeType tree[maxn<<]; int n,ko,root,tot,cur,ans,tot_; inline void in(int &now)
{
register char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} inline int getson(int now)
{
return tree[tree[now].opi].ch[]==now;
} inline void updata(int now)
{
tree[now].size=tree[now].w;
if(tree[now].ch[]) tree[now].size+=tree[tree[now].ch[]].size;
if(tree[now].ch[]) tree[now].size+=tree[tree[now].ch[]].size;
} inline void rotate(int now)
{
int opi=tree[now].opi,fopi=tree[opi].opi,pos=getson(now);
if(tree[tree[now].ch[pos^]].opi)tree[tree[now].ch[pos^]].opi=opi;
tree[opi].ch[pos]=tree[now].ch[pos^];
if(fopi) tree[fopi].ch[getson(opi)]=now;
tree[opi].opi=now;tree[now].opi=fopi;
tree[now].ch[pos^]=opi;
updata(opi),updata(now);
} void splay(int now)
{
for(int opi;opi=tree[now].opi;rotate(now))
{
if(tree[opi].opi) rotate(getson(now)==getson(opi)?opi:now);
}
root=now;
} void insert(int x)
{
if(!root) tree[++tot].create(x),root=tot;
else
{
int now=root,opi=;
while()
{
if(tree[now].key==x)
{
tree[now].w++;
tree[now].size++;
splay(now);
break;
}
opi=now,now=tree[now].ch[x>tree[now].key];
if(!now)
{
tot++;
tree[tot].create(x);
tree[tot].opi=opi;
tree[opi].ch[x>tree[opi].key]=tot;
splay(tot);break;
}
}
}
} void del()
{
ans+=tree[root].size-;
if(!tree[root].ch[]) tree[].destroy(),root=;
else
{
int tmp=root;
root=tree[root].ch[];
tree[tmp].destroy();
tree[root].opi=;
ans-=tree[root].size;
}
} int rank(int x)
{
int now=root;
while()
{
if(tree[now].ch[])
{
if(x>tree[tree[now].ch[]].size) x-=tree[tree[now].ch[]].size;
else
{
now=tree[now].ch[];
continue;
}
}
if(x<=tree[now].w)
{
splay(now);
return tree[now].key;
}
else
{
x-=tree[now].w;
now=tree[now].ch[];
}
}
} int main()
{
in(n),in(ko),ko--;
char ch[];int pos;
while(n--)
{
scanf("%s",ch);in(pos);
if(ch[]=='I') if(pos>ko) insert(pos+cur-ko),tot_++;
if(ch[]=='A') cur-=pos;
if(ch[]=='S') cur+=pos,insert(cur),del();
if(ch[]=='F')
{
if(tot_-ans>=pos) printf("%d\n",rank(tot_-ans-pos+)-cur+ko);
else printf("-1\n");
}
}
printf("%d\n",ans);
return ;
}

AC日记——郁闷的出纳员 codevs 1286的更多相关文章

  1. AC日记——接龙游戏 codevs 1051

    1051 接龙游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 给出了N个单词,已经按长度排好了序.如果 ...

  2. AC日记——地鼠游戏 codevs 1052

    1052 地鼠游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...

  3. AC日记——鬼谷子的钱袋 codevs 2998

    2998 鬼谷子的钱袋 2006年省队选拔赛湖南  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master    题目描述 Description 鬼谷子非常聪明,正 ...

  4. AC日记——舒适的路线 codevs 1001 (并查集+乱搞)

    1001 舒适的路线 2006年  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description Z小镇是 ...

  5. AC日记——逃跑的拉尔夫 codevs 1026 (搜索)

    1026 逃跑的拉尔夫  时间限制: 1 s    空间限制: 128000 KB    题目等级 : 黄金 Gold 题解       题目描述 Description   年轻的拉尔夫开玩笑地从一 ...

  6. AC日记——自然数和分解 codevs 2549

    自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; ][]; int main() { cin>> ...

  7. AC日记——营业额统计 1296 codevs

    1296 营业额统计 2002年  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description Tiger ...

  8. AC日记——花店橱窗布置 codevs 1028

    题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...

  9. AC日记——最优贸易 codevs 1173

    题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...

随机推荐

  1. Linux下Oracle JDK替换Open JDK

    Oracle的产品需要Oracle JDK,但是Linux发行版附带的都是开源的Open JDK,这里给出的方法是在不删除原有Open JDK的情况下,安装Oracle JDK 环境 系统:CentO ...

  2. mongoTemplate聚合操作Demo

    package com.tangzhe.mongodb.mongotemplate; import com.mongodb.BasicDBObject; import com.mongodb.DBOb ...

  3. Nhibernate官方体系结构图部分中文翻译

    原文链接 :http://nhibernate.info/doc/nh/en/index.html#architecture 体系结构图 高度抽象NHibernate体系架构图 这幅图展示了NHibe ...

  4. ASP.NET Core 利用中间件支持跨域请求

    方法1: 在Startup的ConfigureServices()中添加services.AddCors()在Startup的Configure()中添加app.UseCors(); 保证其在app. ...

  5. psql 工具详细使用介绍

    psql 介绍 psql 是 PostgreSQL 中的一个命令行交互式客户端工具, 它允许你交互地键入 SQL 命令,然后把它们发送给 PostgreSQL 服务器,再显示 SQL 或命令的结果. ...

  6. redhat--1

    ---------------- ---------------- 免密码ssh远程登录设置 . In host1, copy the ssh-key to the host2 hosts # ssh ...

  7. redis应用场景及实例

    Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储;它的数据模型非常独特,用的是单线程.另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不 ...

  8. iOS-字体UIFont的lineHeight与pointSize

    首先我们来看一看UIFont的API里面有哪些属性: // Font attributes @property(nonatomic,readonly,strong) NSString *familyN ...

  9. GDKOI 游记

    Day 0 坐和谐号去广州 非常奇怪的一点是,每次坐车去广州人都很少,但是坐车回来人都贼多...... 到酒店住下,出去吃完晚饭,lmy开始奶:明天考数据结构啊! zkw:为什么不考AC自动机和插头D ...

  10. css 两列自适应布局的4种思路

    前面的话 前面已经介绍过css 两列布局中单列定宽单列自适应布局的6种思路的两列布局,而两列自适应布局是指一列由内容撑开,另一列撑满剩余宽度的布局方式.本文将从float.table.flex和gri ...