AC日记——郁闷的出纳员 codevs 1286
思路:
设工资下限为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的更多相关文章
- AC日记——接龙游戏 codevs 1051
1051 接龙游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出了N个单词,已经按长度排好了序.如果 ...
- AC日记——地鼠游戏 codevs 1052
1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...
- AC日记——鬼谷子的钱袋 codevs 2998
2998 鬼谷子的钱袋 2006年省队选拔赛湖南 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 鬼谷子非常聪明,正 ...
- AC日记——舒适的路线 codevs 1001 (并查集+乱搞)
1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Z小镇是 ...
- AC日记——逃跑的拉尔夫 codevs 1026 (搜索)
1026 逃跑的拉尔夫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 年轻的拉尔夫开玩笑地从一 ...
- AC日记——自然数和分解 codevs 2549
自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; ][]; int main() { cin>> ...
- AC日记——营业额统计 1296 codevs
1296 营业额统计 2002年 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description Tiger ...
- AC日记——花店橱窗布置 codevs 1028
题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...
- AC日记——最优贸易 codevs 1173
题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...
随机推荐
- 模拟:HDU1034-Candy Sharing Game
解题心得: 1.直接模拟每一次分一半就行了,模拟过程,记录轮数,但是也看到有些大神使用的是链表,估计链表才是真的做法吧. 题目: Candy Sharing Game Time Limit: 2000 ...
- ACM模板
#include <iostream> //万能头文件#include<bits/stdc++.h> 方便时用 #include <algorithm> #incl ...
- (PowerDesigner&Sqlite)PD中设计完表后,将其导入数据库中
本人连接过SQLServer跟SQLite Ⅰ.SQLServer,百度,转一下:http://jingyan.baidu.com/article/7f766daf465e9c4101e1d0d5.h ...
- java.util.ArrayList与java.util.Arrays$ArrayList区别
本博客转载自:https://blog.csdn.net/maywehe/article/details/52553954 写demo的时候,为了避免用list.add方法,特意写了个数组然后转换成l ...
- 移动Web应用程序开发HTML5篇
https://software.intel.com/zh-cn/blogs/2012/03/09/webhtml5-offline-web-applications
- 7、JavaScript 知识总结
1.JavaScript的作用 ①JavaScript 为 HTML 设计师提供了一种编程工具 ②JavaScript 可以将动态的文本放入 HTML 页面 ③JavaScript 可以对事件作出响应 ...
- URL 传参中需要处理的特殊字符
例如实际请求URL如下: http://www.douwansha.com/mdeditor?data=[{"address":null,"name":&quo ...
- File IO(NIO.2):文件操作
简介 Files类是java.nio.file包的另一个主要入口点.该类提供了一组丰富的静态方法,用于读取,写入和操作文件和目录.Files方法适用于Path对象的实例.在进行其余部分之前,您应该熟悉 ...
- 【转】Unity3d实现物体围绕某一点进行旋转
1,让一个物体围绕某一点旋转,有几种方法?分别是什么? 答:在这个点处放一个空物体B,则问题变为A绕着B旋转, 方法1:B不动,A挂脚本实现transform的RotateAround(vector3 ...
- 使用BootStrap网格布局进行一次演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...