BZOJ1503:[NOI2004]郁闷的出纳员
浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html
浅谈\(fhq\)_\(treap\):https://www.cnblogs.com/AKMer/p/9981274.html
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1503
对于每个人都加工资,我们可以直接降低最低工资标准来判断,对于减工资,我们就加标准,那么每个人与最低标准的差值始终是正确的。
我们记一个\(now\)表示当前最低工资标准,记一个\(mn\)表示初始工资标准。那么每次进来一个工资为\(k\)的人,我们要使他与最低工资标准的差值是正确的,就应该使\(k\)加上\(now-mn\)。
而每个人与当前最低标准的差值加上初始标准,就是真实工资。
时间复杂度:\(O(nlogn)\)
空间复杂度:\(O(n)\)
\(splay\)版代码如下:
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn=1e5+5;
char s[25];
int n,mn,now,tot;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct Splay {
int tot,root;
int fa[maxn],son[maxn][2];
int siz[maxn],cnt[maxn],val[maxn];
int newnode(int v) {
val[++tot]=v;
siz[tot]=cnt[tot]=1;
return tot;
}
int find(int v) {
int u=root;
while(val[u]!=v) {
if(val[u]>v) {if(son[u][0])u=son[u][0];else break;}
if(val[u]<v) {if(son[u][1])u=son[u][1];else break;}
}
return u;
}
int t(int u) {
return son[fa[u]][1]==u;
}
void update(int p) {
siz[p]=siz[son[p][0]]+cnt[p]+siz[son[p][1]];
}
void rotate(int u) {
int ret=t(u),f=fa[u],s=son[u][ret^1];
son[f][ret]=s;if(s)fa[s]=f;son[u][ret^1]=f;
fa[u]=fa[f];if(fa[f])son[fa[f]][t(f)]=u;
fa[f]=u;update(f);update(u);
}
void splay(int u) {
while(fa[u]) {
if(fa[fa[u]]) {
if(t(fa[u])==t(u))rotate(fa[u]);
else rotate(u);
}
rotate(u);
}
root=u;
}
void ins(int v) {
if(!root) {root=newnode(v);return;}
int u=find(v);
if(val[u]==v) {siz[u]++;cnt[u]++;splay(u);return;}
fa[newnode(v)]=u;son[u][v>val[u]]=tot;
splay(tot);
}
void check() {
int u=find(now);splay(u);
if(val[u]<now) {
u=son[u][1];
while(son[u][0])u=son[u][0];
splay(u);
}
fa[son[u][0]]=0;
son[u][0]=0;update(u);
}
int get_val(int k) {
int u=root,rk=siz[u]-k+1;
if(rk<1)return -1;
while(rk) {
if(siz[son[u][0]]>=rk)u=son[u][0];
if(siz[son[u][0]]<rk&&siz[son[u][0]]+cnt[u]>=rk)break;
if(siz[son[u][0]]+cnt[u]<rk)rk-=siz[son[u][0]]+cnt[u],u=son[u][1];
}
return val[u]+mn-now;
}
}T;
int main() {
n=read(),now=mn=read();
for(int i=1;i<=n;i++) {
scanf("%s",s+1);
int k=read();
if(s[1]=='I') {
k+=now-mn;
if(k<now)continue;
T.ins(k);tot++;
}
if(s[1]=='A')now-=k;
if(s[1]=='S') {
now+=k;
T.check();
}
if(s[1]=='F')printf("%d\n",T.get_val(k));
}
printf("%d\n",tot-T.siz[T.root]);
return 0;
}
\(fhq\)_\(treap\)版代码如下:
#include <ctime>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef pair<int,int> pii;
const int maxn=1e5+5;
char s[25];
int n,m,tot,mn,now;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct fhq_treap {
int tot,root;
int fix[maxn],son[maxn][2];
int siz[maxn],cnt[maxn],val[maxn];
int newnode(int v) {
val[++tot]=v;fix[tot]=rand();
siz[tot]=cnt[tot]=1;return tot;
}
int getkth(int u,int v,bool &bo,int delta) {
if(!u)return 0;int ans=0;
if(val[u]>v)ans=getkth(son[u][0],v,bo,delta);
else if(val[u]==v) {
if(delta)cnt[u]+=delta,siz[u]+=delta,bo=1;
return siz[son[u][0]];
}
else ans=siz[son[u][0]]+cnt[u]+getkth(son[u][1],v,bo,delta);
if(bo)siz[u]+=delta;return ans;
}
void update(int p) {
siz[p]=siz[son[p][0]]+cnt[p]+siz[son[p][1]];
}
pii split(int u,int rk) {
if(!rk)return make_pair(0,u);
if(rk==siz[u])return make_pair(u,0);
if(siz[son[u][0]]>=rk) {
pii tmp=split(son[u][0],rk);
son[u][0]=tmp.second,update(u);
return make_pair(tmp.first,u);
}
else {
pii tmp=split(son[u][1],rk-siz[son[u][0]]-cnt[u]);
son[u][1]=tmp.first,update(u);
return make_pair(u,tmp.second);
}
}
int merge(int a,int b) {
if(!a||!b) return a+b;
if(fix[a]>fix[b])return son[a][1]=merge(son[a][1],b),update(a),a;
else return son[b][0]=merge(a,son[b][0]),update(b),b;
}
void ins(int v) {
bool bo=0;int rk=getkth(root,v,bo,1);
if(bo)return;pii tmp=split(root,rk);
root=merge(merge(tmp.first,newnode(v)),tmp.second);
}
void check() {
bool bo=0;
int rk=getkth(root,now,bo,0);
pii tmp=split(root,rk);root=tmp.second;
}
int get_val(int k) {
int u=root,rk=siz[u]-k+1;
if(rk<1)return -1;
while(rk) {
if(siz[son[u][0]]>=rk)u=son[u][0];
if(siz[son[u][0]]<rk&&siz[son[u][0]]+cnt[u]>=rk)break;
if(siz[son[u][0]]+cnt[u]<rk)rk-=siz[son[u][0]]+cnt[u],u=son[u][1];
}
return val[u]+mn-now;
}
}T;
int main() {
srand(time(0));
n=read(),now=mn=read();
for(int i=1;i<=n;i++) {
scanf("%s",s+1);int k=read();
if(s[1]=='I') {
k+=now-mn;
if(k<now)continue;
T.ins(k);tot++;
}
if(s[1]=='A')now-=k;
if(s[1]=='S') {
now+=k;
T.check();
}
if(s[1]=='F')printf("%d\n",T.get_val(k));
}
printf("%d\n",tot-T.siz[T.root]);
return 0;
}
BZOJ1503:[NOI2004]郁闷的出纳员的更多相关文章
- [BZOJ1503][NOI2004]郁闷的出纳员
[BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 8705 Solved: 3027[Submit][Statu ...
- [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] 郁闷的出纳员 (treap)
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- BZOJ1503[NOI2004]郁闷的出纳员——treap
OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心 ...
- [luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- BZOJ1503: [NOI2004]郁闷的出纳员(Splay)
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...
- BZOJ1503 [NOI2004]郁闷的出纳员 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...
- 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)
bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...
随机推荐
- delphi 解析Json格式(转自:http://blog.csdn.net/jayqiang/article/details/7066824)
SuperObject 是开源的 Delphi 的 JSON 工具包,可生成 JSON 数据以及进行 JSON 解析. unit Unit6; interface uses Windows, Mess ...
- selenium3 踩坑--move_to_element()报错
问题:selenium3 使用move_to_element()报错,报错信息如下图所示: 网上没有找到合适的解决办法,回退到稳定的selenium2可以解决. pip install seleniu ...
- 【Python】IDLE启动错误
启动IDLE时报Subprocess Startup Error错误 错误信息 IDLE's subprocess didn't make connection.Either IDLE cant't ...
- SQLServer -- SQL Server Database Error: 内部 SQL Server 错误
报表在SQLserver2008运行统计正常,但是在SQLserver2000运行报错,SQL直接执行报:内部 SQL Server 错误. 不断的排查,最终得到的结论是:SQLserver2000似 ...
- Windows系统下正确安装MongoDB
1.下载.安装 官网下载: http://www.mongodb.org/downloads 下载好之后,接下来进行安装了: 2.创建数据文件夹 MongoDB将数据文件夹存储在 db 文件夹下. 可 ...
- 再看GS接包过程
再看GS接包过程 bool GameServer::ProcessLoop(packet& rPkt) { if(false == m_spDataLayer->Recv(rPkt)) ...
- 【转】soapUI和Jmeter的接口测试结构区别
使用SoapUI和Jmeter都可以进行自动化接口测试,但是每个工具都有自身的特点,所以他们的结构也有一定的区别 SoapUI 项目名称 -Rest服务.Rest资源 在使用SoapUI进行接口测试时 ...
- HTML5(lufylegend.js练习)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 【题解】CF24D Broken Robots(收敛性)
[题解]CF24D Broken Robots http://codeforces.com/problemset/problem/24/D 解1(不会写,口胡的) 获得一个比较显然的转移式子 \(dp ...
- 【题解】CF359B Permutation
[题解]CF359B Permutation 求一个长度为\(2n\)的序列,满足\(\Sigma |a_{2i}-a_{2i-1}|-|\Sigma a_{2i}-a_{2i-1}|=2k\) 这种 ...