一道 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]郁闷的出纳员(到底是谁郁闷啊?)的更多相关文章

  1. BZOJ 1503: [NOI2004]郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 10526  Solved: 3685[Submit][Stat ...

  2. [BZOJ1503][NOI2004]郁闷的出纳员

    [BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...

  3. BZOJ 1503: [NOI2004]郁闷的出纳员 splay

    1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...

  4. 【BZOJ】【1503】 【NOI2004】郁闷的出纳员

    Splay Splay的模板题吧……妥妥的序列操作= =(好像有段时间没写过这种纯数据结构题了……) /************************************************ ...

  5. bzoj 1503: [NOI2004]郁闷的出纳员 Treap

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 6263  Solved: 2190[Submit][Statu ...

  6. bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 8705  Solved: 3027[Submit][Statu ...

  7. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

  8. 1503: [NOI2004]郁闷的出纳员 (SBT)

    1503: [NOI2004]郁闷的出纳员 http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Time Limit: 5 Sec  Memory ...

  9. P1486 [NOI2004]郁闷的出纳员

    P1486 [NOI2004]郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷 ...

  10. 伸展树的基本操作——以【NOI2004】郁闷的出纳员为例

    前两天老师讲了伸展树……虽然一个月以前自己就一直在看平衡树这一部分的书籍,也仔细地研读过伸展树地操作代码,但是就是没写过程序……(大概也是在平衡树的复杂操作和长代码面前望而生畏了)但是今天借着老师布置 ...

随机推荐

  1. SpringMVC+Shiro不拦截静态资源配置

    最近在弄SpringMVC与Shiro整合,发现如果将DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果DispatcherServlet改为拦截“/” ...

  2. UVA - 1328 Period(循环节kmp)

    https://vjudge.net/problem/UVA-1328 题意 求每个前缀的最小循环节,要求至少循环两次且为完整的. 分析 求next数组,i-next[i]即为前缀i的最小循环节,再判 ...

  3. [Android] Android 使用 Greendao 操作 db sqlite(2)-- 封装DaoUtils类

    继续接上文: Android 使用 Greendao 操作 db sqlite(1)-- 直接在MainActivity中调用 布局文件同上文一致,这里就不贴了. 一.封装DaoUtils类 User ...

  4. Spring Bean的ref属性和IoC注入集合

    这是一个Demo 1.Phone.java package com.cn.pojo; public class Phone { private String name; private double ...

  5. 【bzoj 3173】[Tjoi2013]最长上升子序列

    Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...

  6. python 学习 argparse

    1. argparse python 中用于解析命令行参数和选项的标准模块 创建一个解析器对象,解析器类ArgumentParser add_argument() 方法用来指定程序接受那些命令行参数, ...

  7. Docker exec 宿主对容器执行命令 - 五

    Docker  下  exec  从宿主机对容器执行命名操作 docker exec -it # 交互可以进入容器 ; exec 也可以在宿主机对容器执行命令: docker attach # 也是可 ...

  8. luogu P2470 [SCOI2007]压缩

    传送门 dalao们怎么状态都设的两维以上啊?qwq 完全可以一维状态的说 设\(f[i]\)为前缀i的答案,转移就枚举从前面哪里转移过来\(f[i]=min(f[j-1]+w(j,i))(j\in ...

  9. 第25月第26天 dispatch_group_t dispatch_semaphore_t

    1. dispatch_group_enter(group); dispatch_group_leave(group); dispatch_group_notify(group1, queue1,bl ...

  10. 【JS】空格分隔手机号

    '88888888888'.replace(/^(.{3})(.*)(.{4})$/, '$1 $2 $3')