浅谈\(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]郁闷的出纳员的更多相关文章

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

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

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

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

  3. [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  4. bzoj1503: [NOI2004]郁闷的出纳员(伸展树)

    1503: [NOI2004]郁闷的出纳员 题目:传送门 题解: 修改操作一共不超过100 直接暴力在伸展树上修改 代码: #include<cstdio> #include<cst ...

  5. [BZOJ1503] [NOI2004] 郁闷的出纳员 (treap)

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  6. BZOJ1503[NOI2004]郁闷的出纳员——treap

    OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心 ...

  7. [luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】

    题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...

  8. BZOJ1503: [NOI2004]郁闷的出纳员(Splay)

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...

  9. BZOJ1503 [NOI2004]郁闷的出纳员 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...

  10. 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)

    bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...

随机推荐

  1. A charge WIFI point base on airbase-ng+dhcp+lamp+wiwiz

    Make wifi as a hot point Make a script echo $0 $1 case $1 in "start") sleep 1 ifconfig wla ...

  2. C# Array类的浅复制Clone()与Copy()的差别

    1 Array.Clone方法 命名空间:System 程序集:mscorlib 语法: public Object Clone() Array的浅表副本仅复制Array的元素,不管他们是引用类型还是 ...

  3. Swift———a Glance(极客学院)笔记

    http://www.swiftv.cn/course/hw4sysi7 本课程很短,加起来一个小时,适合作为一个快速了解.   两本书: apple官方<The Swift Programmi ...

  4. [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  5. 【BZOJ4241】历史研究 分块

    [BZOJ4241]历史研究 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开 ...

  6. Python --- Scrapy 命令(转)

    Scrapy 命令 分为两种: 全局命令 和 项目命令 . 全局命令:在哪里都能使用. 项目命令:必须在爬虫项目里面才能使用. 全局命令 C:\Users\AOBO>scrapy -h Scra ...

  7. 九度OJ 1017:还是畅通工程 (最小生成树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4789 解决:2382 题目描述:     某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程&quo ...

  8. AWS:2.根设备类型、EC2生命周期状态、User Data

    主要内容 1.根设备类型 linux: /dev/sda1 windows: 系统盘 2.实例生命周期 生命周期状态:停止.终止.重启 3.用户数据(UserData) 实例在初始化,运行之前给定的用 ...

  9. going

  10. Python爬虫-- BeautifulSoup库

    BeautifulSoup库 beautifulsoup就是一个非常强大的工具,爬虫利器.一个灵活又方便的网页解析库,处理高效,支持多种解析器.利用它就不用编写正则表达式也能方便的实现网页信息的抓取 ...