bzoj1503[NOI2004]郁闷的出纳员——Splay
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1503
好奇怪呀!为什么而TLE?
各种修改终于卡时过了。可是大家比我快多了呀?难道是因为自己把相同节点弄成一个节点、记了一个cnt的缘故?
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e5+;
int n,c[N][],fa[N],siz[N],cnt[N],ans,tot,rt;
ll lm,val[N],fx;
void pushup(int k){siz[k]=siz[c[k][]]+siz[c[k][]]+cnt[k];}
//void insert(int &k,int f,ll s)
//{
// if(!k){k=++tot;siz[k]=1;cnt[k]=1;val[k]=s;fa[k]=f;return;}
// if(s==val[k]){cnt[k]++;siz[k]++;return;}
// int d=(s>val[k]);insert(c[k][d],k,s);
// pushup(k);
//}
void rotate(int x,int &k)
{
int y=fa[x],z=fa[y];
if(y==k)k=x;
else c[z][y==c[z][]]=x;
int d=(x==c[y][]);
fa[x]=z;fa[y]=x;fa[c[x][!d]]=y;//fa[x]=z在这里,不是43行
c[y][d]=c[x][!d];c[x][!d]=y;
pushup(y);pushup(x);
}
void splay(int x,int &k)
{
while(x!=k)
{
int y=fa[x],z=fa[y];
if(y!=k)
{
if((c[y][]==x)^(c[z][]==y))rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
void insert(ll s)
{
if(!rt){rt=++tot;siz[rt]=;cnt[rt]=;val[rt]=s;fa[rt]=;return;}
int z,p=rt;
while(p)
{
z=p;
siz[p]++;
if(s==val[p]){cnt[p]++;splay(p,rt);return;}//
p=c[p][s>val[p]];
}
p=++tot;cnt[p]=;siz[p]=;val[p]=s;
fa[p]=z;c[z][s>val[z]]=p;
splay(p,rt);//
}
int find(int k,ll s)
{
if(!k)return ;
if(val[k]==s)return k;
int d=(s>val[k]);
return find(c[k][d],s);
}
void del(ll s)
{
int k=find(rt,s);if(!k)return;//
if(k!=rt)splay(k,rt);
ans+=siz[c[k][]];
if(cnt[k]==)rt=c[k][];
else {
cnt[k]--;fa[c[k][]]=;c[k][]=;pushup(k);
}
}
ll query(int k,int s)
{
if(siz[c[k][]]<s&&siz[c[k][]]+cnt[k]>=s)return val[k];
if(siz[c[k][]]>=s)return query(c[k][],s);
else return query(c[k][],s-siz[c[k][]]-cnt[k]);//
}
int main()
{
scanf("%d%lld",&n,&lm);char ch;ll tp;
while(n--)
{
cin>>ch;scanf("%lld",&tp);
if(ch=='I')
{
if(tp-fx<lm)continue;
// else insert(rt,0,tp-fx);
else insert(tp-fx);
}
else if(ch=='A')fx+=tp,lm-=tp;
else if(ch=='S')
{
fx-=tp;lm+=tp;
// insert(rt,0,lm);
insert(lm);del(lm);
}
else {
if(tp>siz[rt])printf("-1\n");
else printf("%lld\n",query(rt,tp)+fx);
}
}
printf("%d",ans);
return ;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e5+;
int n,c[N][],fa[N],siz[N],cnt[N],ans,tot,rt;
ll lm,val[N],fx;
void pushup(int k){siz[k]=siz[c[k][]]+siz[c[k][]]+cnt[k];}
//void insert(int &k,int f,ll s)
//{
// if(!k){k=++tot;siz[k]=1;cnt[k]=1;val[k]=s;fa[k]=f;return;}
// if(s==val[k]){cnt[k]++;siz[k]++;return;}
// int d=(s>val[k]);insert(c[k][d],k,s);
// pushup(k);
//}
void rotate(int x,int &k)
{
int y=fa[x],z=fa[y];
if(y==k)k=x;
else c[z][y==c[z][]]=x;
int d=(x==c[y][]);
fa[x]=z;fa[y]=x;fa[c[x][!d]]=y;//fa[x]=z在这里,不是43行
c[y][d]=c[x][!d];c[x][!d]=y;
pushup(y);pushup(x);
}
void splay(int x,int &k)
{
while(x!=k)
{
int y=fa[x],z=fa[y];
if(y!=k)
{
if((c[y][]==x)^(c[z][]==y))rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
void insert(ll s)
{
if(!rt){rt=++tot;siz[rt]=;cnt[rt]=;val[rt]=s;fa[rt]=;return;}
int z,p=rt;
while(p)
{
z=p;
siz[p]++;
if(s==val[p]){cnt[p]++;splay(p,rt);return;}//
p=c[p][s>val[p]];
}
p=++tot;cnt[p]=;siz[p]=;val[p]=s;
fa[p]=z;c[z][s>val[z]]=p;
splay(p,rt);//
}
//int find(int k,ll s)
//{
// if(!k)return 0;
// if(val[k]==s)return k;
// int d=(s>val[k]);
// return find(c[k][d],s);
//}
//void del(ll s)
//{
// int k=find(rt,s);if(!k)return;//
// if(k!=rt)splay(k,rt);
// ans+=siz[c[k][0]];
// if(cnt[k]==1)rt=c[k][1];
// else {
// cnt[k]--;fa[c[k][0]]=0;c[k][0]=0;pushup(k);
// }
//}
int del(int &k,int f)
{
if(!k)return ;//
int rtn=;
if(val[k]<lm||(val[k]==lm&&cnt[k]==))
{
rtn=del(c[k][],k)+siz[c[k][]]+cnt[k];
siz[c[k][]]=siz[k]-rtn;
k=c[k][];fa[k]=f;
}
else{
if(val[k]==lm)cnt[k]--,rtn++;
rtn+=del(c[k][],k);
siz[k]-=rtn;
}
return rtn;
}
ll query(int k,int s)
{
if(siz[c[k][]]<s&&siz[c[k][]]+cnt[k]>=s)return val[k];
if(siz[c[k][]]>=s)return query(c[k][],s);
else return query(c[k][],s-siz[c[k][]]-cnt[k]);//
}
int main()
{
scanf("%d%lld",&n,&lm);char ch;ll tp;
while(n--)
{
cin>>ch;scanf("%lld",&tp);
if(ch=='I')
{
if(tp-fx<lm)continue;
// else insert(rt,0,tp-fx);
else insert(tp-fx);
}
else if(ch=='A')fx+=tp,lm-=tp;
else if(ch=='S')
{
fx-=tp;lm+=tp;
// insert(rt,0,lm);
insert(lm);
ans+=del(rt,)-;
}
else {
if(tp>siz[rt])printf("-1\n");
else printf("%lld\n",query(rt,tp)+fx);
}
}
printf("%d",ans);
return ;
}
可以非递归地 insert。
这两个的del方式不同。
bzoj1503[NOI2004]郁闷的出纳员——Splay的更多相关文章
- BZOJ1503 [NOI2004]郁闷的出纳员 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...
- [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公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...
随机推荐
- rsync的配置文件模板及简单介绍,命令及参数
必须知道推送有一个限速参数.--bwlimit=100 工作总必须要加.有三种模式,1.本地的模拟cp命令,在一个服务器2.远程的两个服务器之间,模拟scp3.以socket进程监听的方式启动rsyn ...
- javascript 事件委托 event delegation
事件委托 event delegation 一.概念: 假设我们有很多个子元素,每个元素被点击时都会触发相应事件,普通的做法是给每个子元素添加一个事件监听. 而,事件委托则是给它们的父元素添加一个事件 ...
- PHP工作笔记:Yii2框架设置页面的关键词和描述
因为都是做系统,很少用到这个设置,标题也是自动生成的,我们公司网站也没有关键词和描述,这样不利于网站获取相关排名. 设置方式: 直接在视图层做如下设置 $this->title = " ...
- is null 和=null的区别
数据库中 null 表示 不可知,不确定 所以 判断都用 字段 is null的方式进行判断 而 = null .<> null 的判断结果,仍然是不可知,不确定,所以 不会返回任何结果. ...
- LINUX系统下CIFS文件系统
一.什么是CIFS CIFS(Common Internet File System)文件系统,也叫通用网络文件系统:它可以使一台主机访问远程主机上共享出去的文件.CIFS使用的C/S模式(客户 ...
- jsp笔记总结
第一章 JavaWeb简介 1.什么是Web应用程序 什么是Web应用程序是一种通过Web访问的应用程序.Web应用程序一个最大优点就是用户很容易访问.用户只需要有浏览器即可,不需要再安装其他软件.W ...
- (二) ffmpeg filter学习--混音实现
Audio 混音实现 从FFMPEG原生代码doc/examples/filtering_audio.c修改而来. ffmpeg版本信息 ffmpeg version N-82997-g557c0df ...
- 我也说说Emacs吧(3) - 文件基本操作
Spacemacs文件基本操作 有了前两讲的积累,我们知道了: 1. 我们既要学习emacs的操作,也要学习vi的操作 2. emacs是一个可扩展的平台,我们并不是从头配置,而是使用一套成熟的集成方 ...
- iOS如何限制使用SDK的版本? 解决iOS项目的版本兼容问题
更新 2015-11-16 感谢微博好友@zyyy_000的评论,补充了为什么要在+ (void)load方法里面做Method Swizzling. 前言 最近,在做项目时,因为某种原因,突然要 ...
- 实战maven私有仓库三部曲之二:上传到私有仓库
在上一章<实战maven私有仓库三部曲之一:搭建和使用>我们搭建了maven私有仓库,并体验了私有仓库缓存jar包的能力,避免了局域网内开发人员去远程中央仓库下载的痛苦等待,本章我们再来体 ...