题目: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的更多相关文章

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

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

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

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

  3. BZOJ 1503: [NOI2004]郁闷的出纳员 splay

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

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

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

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

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

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

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

  7. NOI2004 郁闷的出纳员 Splay

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

  8. 【BZOJ1503】 [NOI2004]郁闷的出纳员 splay

    splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && ...

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

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

随机推荐

  1. js中常用的字符串方法

    1,基础方法 charAt();返回该位置的字符,类似数组下标: substring();返回选中的字符,两个参数是下标. slice();参数是是一个正数,返回该数之后的剩余字符串:参数是负数,返回 ...

  2. nginx默认配置

    user nobody; worker_processes 2; worker_cpu_affinity 000000001000 000000010000; worker_rlimit_nofile ...

  3. python 调用接口

    这个比较乱,抽口再修改一下. 工作需要调有赞API的接口数据,  返回数据. 进行数据处理 现在两部分比较重要:1 自动获取数据  ,  2处理excel的过程. 明白接口的过程.传入参数   htt ...

  4. MyCat入门指南

    入门篇 1.       安装 1.1从https://github.com/MyCATApache/Mycat-download下载压缩包 1.2解压缩后复制到相应目录下面,比如/usr/local ...

  5. C#笔记 -- 协变、逆变

    协变 理解:在泛型和委托中, 让使用某个泛型参数A的类型可以用一个使用由A派生的泛型参数B的类型实例化,(小=> 大)如 ​ // IEnumerable<Animal> 与 Lis ...

  6. C#使用Docx操作word文档

    C#使用Docx编写word表格 最近接手了一个小Demo,要求使用Docx,将Xml文件中的数据转换为word文档,组织数据形成表格. 写了已经一周,网络上的知识太零碎,就想自己先统计整理出来,方便 ...

  7. MD5加密(java和c#)

    java代码 public static String md5(String str) { try { MessageDigest md = MessageDigest.getInstance(&qu ...

  8. ES获取磁盘使用率情况

    private void diskUage() { ClusterStateResponse stateResponse = client.admin().cluster().prepareState ...

  9. Oracle 对比两张表不一样 的数据

    闲来无事,更一片博客,前几天有一个项目中有一个需求,用户通过excel导入数据,由于是通用的导入,所以导入的列的类型都为varchar,所以需要建一张中间表,使其列都为varchar类型,然后通过存储 ...

  10. 20165202 2017-2018-2 《Java程序设计》第9周学习总结

    教材学习内容总结 Ch13 URL类 URL类是java.net包中的一个重要的类,URL的实例封装着一个统一资源定位符,使用URL创建对象的应用程序称作客户端程序. 一个URL对象通常包含最基本的三 ...