[NOI2004]郁闷的出纳员(到底是谁郁闷啊?)
一道 FHQ treap 的裸水题,卡了这么久。(咦~一看就是修为不够)
题解什么的,不用看的(话说那我为什么要写这篇题解咧...),直接 FHQ 模板腾上去就能秒 A 了(打脸)
谈谈 debug ... 首先是一个 0 写成了 1 ,GG ,然后是 m-1 出现了乱七八糟的东西,然后又被误导在 insert 操作不执行时 ++res ... 等,以上
(咦~这个人一看就是菜鸡这么裸的题都要 debug 这么久)(*/ω\*)
所以就是 要套 FHQ 里面的merge 、split_key、split_val、get_rank、ins (以及一些update 、pushdown、rand 什么零碎操作)
如果你还不是很了解 FHQ treap ,可以看这里
然后这题的增减工资其实可以打一下懒标记的啦~(一开始没搞清楚状况没用懒标记直接对 m 进行操作,后来发现这个增减工资只对操作前存在的员工有用啊!),
split 的时候 pushdown 一下就好了(merge 是不用的,因为这里没有直接merge的操作,都是先split完了之后才merge的)
所以...上代码...
//by Judge
#include<iostream>
#include<cstdio>
using namespace std;
const int M=2e5+;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
int x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-''; return x*f;
}
inline int cread(){
char c=getchar();
while(!isupper(c)) c=getchar();
switch(c){
case 'I': return ;
case 'A': return ;
case 'S': return ;
case 'F': return ;
}
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
int n,m,q,res,cnt,root;
struct Node { int val,key,siz,tag,ch[]; } t[M];
inline int Rand() { static int seed=; return seed=int(seed*48271LL%(~0u>>)); }
inline void update(int now){ t[now].siz=t[t[now].ch[]].siz+t[t[now].ch[]].siz+; }
inline void pushdown(int now){ //多了pushdown
t[t[now].ch[]].val+=t[now].tag,t[t[now].ch[]].val+=t[now].tag,
t[t[now].ch[]].tag+=t[now].tag,t[t[now].ch[]].tag+=t[now].tag,t[now].tag=;
}
int merge(int u,int v) {
if(!u || !v) return u|v;
if(t[u].key<t[v].key) { t[u].ch[]=merge(t[u].ch[],v),update(u); return u; }
else { t[v].ch[]=merge(u,t[v].ch[]),update(v); return v; }
}
void split_val(int now,int k,int& x,int& y) {
if(!now) return (void)(x=y=); pushdown(now);
if(t[now].val<=k) split_val(t[x=now].ch[],k,t[now].ch[],y);
else split_val(t[y=now].ch[],k,x,t[now].ch[]); update(now);
}
void split_k(int now,int k,int& x,int& y) {
if(!now) return (void)(x=y=); pushdown(now);
if(t[t[now].ch[]].siz>=k) split_k(t[y=now].ch[],k,x,t[now].ch[]),update(now);
else split_k(t[x=now].ch[],k-t[t[now].ch[]].siz-,t[now].ch[],y),update(now);
}
inline void ins(int x) { int u,a,b; t[u=++cnt].key=Rand(),t[u].val=x,t[u].siz=,split_val(root,x,a,b),root=merge(merge(a,u),b); }
inline int get_val(int x) { int a,b,c,d,e; split_k(root,x-,a,b),split_k(b,,c,d),e=t[c].val,root=merge(a,merge(c,d)); return e; }
signed main() {
n=read(),m=read()-;
for(int opt,x;n;--n){
opt=cread(),x=read();
switch(opt){ //四个较为常规的操作
case : if(x>m) ins(x); break;
case : t[root].val+=x,t[root].tag+=x; break;
case : t[root].val-=x,t[root].tag-=x,split_val(root,m,x,root),res+=t[x].siz; break;
case : print(x>t[root].siz?-:get_val(t[root].siz-x+)); break;
} Ot();
} print(res),Ot(); return ;
}
[NOI2004]郁闷的出纳员(到底是谁郁闷啊?)的更多相关文章
- 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公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
- 【BZOJ】【1503】 【NOI2004】郁闷的出纳员
Splay Splay的模板题吧……妥妥的序列操作= =(好像有段时间没写过这种纯数据结构题了……) /************************************************ ...
- bzoj 1503: [NOI2004]郁闷的出纳员 Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 6263 Solved: 2190[Submit][Statu ...
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 8705 Solved: 3027[Submit][Statu ...
- BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树
BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...
- 1503: [NOI2004]郁闷的出纳员 (SBT)
1503: [NOI2004]郁闷的出纳员 http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Time Limit: 5 Sec Memory ...
- P1486 [NOI2004]郁闷的出纳员
P1486 [NOI2004]郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷 ...
- 伸展树的基本操作——以【NOI2004】郁闷的出纳员为例
前两天老师讲了伸展树……虽然一个月以前自己就一直在看平衡树这一部分的书籍,也仔细地研读过伸展树地操作代码,但是就是没写过程序……(大概也是在平衡树的复杂操作和长代码面前望而生畏了)但是今天借着老师布置 ...
随机推荐
- 使用git遇到的一些问题
上传github时忽略.DS_Store方法 这个文件在mac中是管理文件夹的位置之类的信息,所以并没有必要上传到git中,这个时候就需要用git.gitignore文件来忽略此类文件. 在默认情况下 ...
- 在.NET程序中实现HttpServer功能
亲爱的下午茶 博客园 首页 新随笔 联系 订阅 管理 随笔-6 文章-0 评论-10 在.NET程序中实现HttpServer功能 最近在实现一个可视化数据解析工具,需要在Wpf程序中实 ...
- 2016vijos 1-1 兔子的字符串(后缀数组 + 二分 + 哈希)
题意: 给出一个字符串,至多将其划分为n部分,每一部分取出字典序最大的子串ci,最小化 最大的ci 先看一个简化版的问题: 给一个串s,再给一个s的子串t,问能否通过将串划分为k个部分,使t成为划分后 ...
- vmware+centos
centos 7 在安装的时候使用 net.ifname=0 biosdevname=0 使网卡名和以前一样 /boot 引导系统启动,内核 /swap 交换分区,临时作为内存使用防止内存不够使用导致 ...
- npm scripts 脚本基础指南
什么是npm脚本? npm 允许在package.json文件里面,使用scripts字段定义脚本命令. 初始化package.json -> npm init -> 经历一系列的问答即可 ...
- 数据建模工具系列 之 让Oracle Data Modeler支持Vertica
引子 在上篇博客中重点介绍了几个建模工具的评估, 并选定了SQL Power Architect作为最终的建模工具, 在评估过程中也对Oracle Data Modeler支持Vertica做了点研究 ...
- 随机生成10元素数组并找出最大元素(Java)
package day01; import java.util.Arrays; import java.util.Random; public class MaxOfArray { public st ...
- 完美解决idea继承maven后,构建项目慢的问题
1.修改远程仓库的位置(maven默认仓库是国外,所以我们下载jar包很慢) 找到我们安装的maven路径下的conf文件夹下的settings.xml文件 将文件复制到 C:\Users\Admin ...
- [译]MediatR, FluentValidation, and Ninject using Decorators
原文 CQRS 我是CQRS模式的粉丝.对我来说CQRS能让我有更优雅的实现.它同样也有一些缺点:通常需要更多的类,workflow不总是清晰的. MediatR MediatR的文档非常不错,在这就 ...
- Docker 更改默认存储目录 - 十一
Cemtos 7 Docker 默认目录是 /var/lib/docker docker info 查看 docker 配置信息 更改 docker 默认目录 : 编辑 启动文件: 编辑 /usr/ ...