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公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...
随机推荐
- maven-surefire-plugin的forkMode分析
Maven运行测试用例时,是通过调用maven的surefire插件并fork一个子进程来执行用例的.forkmode属性中指明是要为每个测试创建一个进程,还是所有测试在同一个进程中完成. <p ...
- Ansible 小手册系列 十(包含和角色)
一.包含 (include) 使用include模块来包含foo文件 tasks: - include: foo.yml --- foo.yml - name: test foo command: e ...
- flume 启动,停止,重启脚本
#!/bin/bash #echo "begin start flume..." #flume的安装根目录(根据自己情况,修改为自己的安装目录) path=/sysware/apa ...
- Linux:echo命令详解
echo命令 用于字符串的输出 格式 echo string 使用echo实现更复杂的输出格式控制 1.显示普通字符串: echo "It is a test" 这里的双引号完全可 ...
- Jquery如何获取ASP.NET服务器控件的值
关键字: Jquery 服务器控件 获取值 由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,总结有以下3种方法: 服务器控件代码:<asp:Te ...
- 使用jQuery操作DOM(1)
1.常见方法 css(“属性”,”属性值”); //设置单个样式 css({属性1:属性值1,属性2:属性值3...}); //设置多个样式 addClass(“样式名”); //追加单个样式 add ...
- 起thread时,运行报错terminate called without an active exception
I am getting a C++ error with threading: terminate called without an active exception Aborted How to ...
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)
4.4.3 约束(Pattern的一部分) 前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约 ...
- Android 代码实现viewPager+fragment 模仿今日头条的顶部导航
模仿今日头条的顶部导航: 下载地址: http://download.csdn.net/detail/u014608640/9917700 效果图:
- Unity3D 屏幕空间雪场景Shader渲染
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...