[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】郁闷的出纳员为例
前两天老师讲了伸展树……虽然一个月以前自己就一直在看平衡树这一部分的书籍,也仔细地研读过伸展树地操作代码,但是就是没写过程序……(大概也是在平衡树的复杂操作和长代码面前望而生畏了)但是今天借着老师布置 ...
随机推荐
- Web API中的模型验证
一.模型验证的作用 在ASP.NET Web API中,我们可以使用 System.ComponentModel.DataAnnotations 命名空间中的属性为模型上的属性设置验证规则. 一个模型 ...
- Django基于正则表达式匹配URL
在Django1.X中,是这样匹配的. 在Django2.X中,是这样匹配的. Django2.X中开始需要用re_path模块进行正则表达式匹配了,太JB坑了,卡了好久这个问题,最后还是问群里面的高 ...
- javasrcipt的作用域和闭包(二)续篇之:函数内部提升机制与Variable Object
一个先有鸡还是先有蛋的问题,先看一段代码: a = 2; var a; console.log(a); 通常我们都说JavaScript代码是由上到下一行一行执行,但实际这段代码输出的结果是2.但这段 ...
- 项目thymeleaf
官方文档:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#link-urls 定义和引用片段 在我们的模板中,我们经常需 ...
- svn各种表示含义及解决
- 前端面试题整理—HTTP篇
1.常见的HTTP方法有哪些? GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器 POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用PO ...
- 常用Java数据库连接池
概述 在这里所谓的数据库连接是指通过网络协议与数据库服务之间建立的TCP连接.通常,与数据库服务进行通信的网络协议无需由应用程序本身实现,原因有三: 实现复杂度大,需要充分理解和掌握相应的通信协议. ...
- gcc 编译 汇编 链接
要想研究使用 gcc, gcc-multilib 这个包是一定要安装的, 它允许通过 -m32 和 -m64 选项来选择生成 32 位或者 64 的 ELF 文件. 我们知道程序的默认起点是 _sta ...
- Retrofit提交Json
1.APIService为自定义接口类, 定义@Headers @Headers({"Content-Type: application/json","Accept: a ...
- SqlExpress与 LocalDB的链接字符串转换
1.如果是连接SQL Server Express databases,需要将连接字符串定义为:Data Source=.SQLEXPRESS" to "Data Source=( ...