BZOJ1503 [NOI2004]郁闷的出纳员 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html
题目传送门 - BZOJ1503
题意概括

如果某一个员工的工资低于了min,那么,他会立即离开,并且一定不会回来了。
最后还要输出一个整数,表示离开公司的员工的总数。
题解
还是splay裸题。
加一个懒标记就可以了。
注意,如果一个人还没有进入公司就因为工资太少而走了,不计入离开公司的员工数中
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=100005;
int fa[N],son[N][2],add[N],val[N],size[N],total,root;
void spt_clear(){
total=root=0;
memset(fa,0,sizeof fa);
memset(son,0,sizeof son);
memset(add,0,sizeof add);
}
void pushup(int x){
size[x]=size[son[x][0]]+size[son[x][1]]+1;
}
void pushson(int x,int v){
add[x]+=v,val[x]+=v;
}
void pushdown(int x){
for (int i=0;i<2;i++)
if (son[x][i])
pushson(son[x][i],add[x]);
add[x]=0;
}
void pushadd(int x){
if (fa[x])
pushadd(fa[x]);
pushdown(x);
}
int wson(int x){
return son[fa[x]][1]==x;
}
void rotate(int x){
if (!fa[x])
return;
int y=fa[x],z=fa[y],L=wson(x),R=L^1;
if (z)
son[z][wson(y)]=x;
fa[x]=z,fa[y]=x,fa[son[x][R]]=y;
son[y][L]=son[x][R],son[x][R]=y;
pushup(y),pushup(x);
}
void splay(int x,int rt){
if (!x)
return;
if (!rt)
root=x;
pushadd(x);
for (int y=fa[x];fa[x];rotate(x),y=fa[x])
if (fa[y])
rotate(wson(x)==wson(y)?y:x);
}
void insert(int v,int &x,int pre){
pushdown(x);
if (x)
return insert(v,son[x][v>val[x]],x);
fa[x=++total]=pre,val[x]=v,size[x]=1;
splay(x,0);
}
int findkth(int x,int k){
pushdown(x);
if (size[son[x][1]]+1==k)
return x;
if (size[son[x][1]]>=k)
return findkth(son[x][1],k);
else
return findkth(son[x][0],k-size[son[x][1]]-1);
}
int findpre(int v,int rt){
if (!rt)
return 0;
pushdown(rt);
if (v>val[rt]){
int x=findpre(v,son[rt][1]);
return x?x:rt;
}
return findpre(v,son[rt][0]);
}
int findpre(int v){
int res=findpre(v,root);
splay(res,0);
return res;
}
int n,Min;
int main(){
scanf("%d%d",&n,&Min);
spt_clear();
int all=0,now=0;
for (int i=1;i<=n;i++){
char op[2];
int v;
scanf("%s%d",op,&v);
if (op[0]=='I'){
if (v<Min)
continue;
insert(v,root,0);
all++;
now++;
}
if (op[0]=='A')
pushson(root,v);
if (op[0]=='S'){
pushson(root,-v);
int wc=findpre(Min);
if (!wc)
continue;
int rt=root;
now-=size[son[rt][0]]+1;
fa[root=son[rt][1]]=0;
son[rt][1]=0;
}
if (op[0]=='F')
printf("%d\n",v>now?-1:val[findkth(root,v)]);
}
printf("%d",all-now);
return 0;
}
BZOJ1503 [NOI2004]郁闷的出纳员 splay的更多相关文章
- bzoj1503[NOI2004]郁闷的出纳员——Splay
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1503 好奇怪呀!为什么而TLE? 各种修改终于卡时过了.可是大家比我快多了呀?难道是因为自己 ...
- [BZOJ1503][NOI2004]郁闷的出纳员
[BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...
- BZOJ 1503: [NOI2004]郁闷的出纳员 splay
1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
- [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- bzoj1503: [NOI2004]郁闷的出纳员(伸展树)
1503: [NOI2004]郁闷的出纳员 题目:传送门 题解: 修改操作一共不超过100 直接暴力在伸展树上修改 代码: #include<cstdio> #include<cst ...
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 8705 Solved: 3027[Submit][Statu ...
- NOI2004 郁闷的出纳员 Splay
郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...
- 【BZOJ1503】 [NOI2004]郁闷的出纳员 splay
splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && ...
- BZOJ1503: [NOI2004]郁闷的出纳员(Splay)
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...
随机推荐
- LightOJ1004
#include<bits/stdc++.h> using namespace std; int Map[106][106]; int Vis[106][106]; int Num[106 ...
- [转]golang中defer的使用规则
转载于:https://studygolang.com/articles/10167 在golang当中,defer代码块会在函数调用链表中增加一个函数调用.这个函数调用不是普通的函数调用,而是会在函 ...
- python-迭代器、生成器、内置函数及面向过程编程
一.迭代器 迭代器是迭代取值的工具,迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的. 为什么要用迭代器呢? 1.可以不依赖索引取值 2.同一时刻在内存中只有一个值,不会过多的占用内存 如何 ...
- bat如何实现图片与名字匹配重命名
背景:有一批图片按顺序截取,需要按照规定的名称进行重名命. 问题:用批处理怎么实现呢?(公司电脑手动重名时,卡的不要不要的) No1:解决:将规定的名称放入criterion.txt中,将批处理Ren ...
- mongo 的导入和导出
1.导出工具:mongoexport 1.概念: mongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件.可以通过参数指 ...
- selenium+python之 辨识alert、window以及操作
1.分辨 首先区别下alert.window和伪装对话框: alert,浏览器弹出框,一般是用来确认某些操作.输入简单的text或用户名.密码等,根据浏览器的不同,弹出框的样式也不一样,不过都是很简单 ...
- Ionic 2: ReferenceError: webpackJsonp is not defined
I'm new to Ionic. I have started project with super template. But when I try to run the app in brows ...
- java多线程快速入门(十七)
多线程通讯实例(必须要有多个线程.必须要管理同一个变量:线程A生产一个变量,线程B消费一个变量) package com.cppdy; class User { public String usern ...
- Nginx详解二十九:基于Nginx的中间件架构设计
基于Nginx的中间件架构 一:了解需求 1.定义Nginx在服务体系中的角色 1.静态资源服务 2.代理服务 3.动静分离 2.静态资源服务的功能设计 3.代理服务 二:设计评估 三:配置注意事项
- mysql出现10060错误
报错内容如下 Can't connect to MySQL server (10060) 提示不能连接 mysql服务. 首先检查任务管理器 看看mysqld.exe进程有没有启动.如果启动了就强制结 ...