郁闷的出纳员 题解(Splay)
看似是要区间修改,然而实际上只需要维护底线和工资的相对大小关系,
瞬间变水
用delta记录对工资的加减,那么添加节点时点权应-delta,输出时+delta
几种操作中减少工资较麻烦:
1.delta-=val;
2.删点
求前驱转到根,删除左子树
这里的删除不用一个一个暴力删,直接断掉子树关系即可
至于求k大 我比较懒直接改成求size-k+1小 (逃)
- #include<cstdio>
- #include<iostream>
- #include<cstring>
- using namespace std;
- const int N=1e5+;
- int n,fa[N],cnt[N],son[N][],size[N],key[N],type,root;
- int line,ans,num,delta;
- void clear(int x)
- {
- fa[x]=cnt[x]=son[x][]=son[x][]=size[x]=key[x]=;
- }
- bool judge(int x)
- {
- return son[fa[x]][]==x;
- }
- void up(int x)
- {
- if(x)
- {
- size[x]=cnt[x];
- if(son[x][])size[x]+=size[son[x][]];
- if(son[x][])size[x]+=size[son[x][]];
- }
- }
- void rotate(int x)
- {
- int old=fa[x],oldf=fa[old],lr=judge(x);
- son[old][lr]=son[x][lr^];
- fa[son[old][lr]]=old;
- son[x][lr^]=old;
- fa[old]=x;
- fa[x]=oldf;
- if(oldf)son[oldf][son[oldf][]==old]=x;
- up(old);up(x);
- }
- void splay(int x)
- {
- for(int f;f=fa[x];rotate(x))
- if(fa[f])rotate(judge(x)==judge(f)?f:x);
- root=x;
- }
- void ins(int x)
- {
- if(!root)
- {
- type++;
- key[type]=x;
- root=type;
- cnt[type]=size[type]=;
- fa[type]=son[type][]=son[type][]=;
- return ;
- }
- int now=root,f=;
- while()
- {
- if(x==key[now])
- {
- cnt[now]++;
- up(now);
- up(f);
- splay(now);
- return ;
- }
- f=now;now=son[now][key[now]<x];
- if(!now)
- {
- type++;
- size[type]=cnt[type]=;
- son[type][]=son[type][]=;
- son[f][x>key[f]]=type;
- fa[type]=f;
- key[type]=x;
- up(f);splay(type);
- return ;
- }
- }
- }
- int getnum(int x)
- {
- int now=root;
- while()
- {
- if(son[now][]&&x<=size[son[now][]])now=son[now][];
- else
- {
- int tmp=size[son[now][]]+cnt[now];
- if(x<=tmp)
- return key[now];
- x-=tmp;now=son[now][];
- }
- }
- }
- int pre()
- {
- if(cnt[root]>)return root;
- int now=son[root][];
- while(son[now][])now=son[now][];
- return now;
- }
- void del(int x)
- {
- //changeroot(x);
- if(cnt[root]>)
- {
- cnt[root]--;
- up(root);
- return ;
- }
- if(!son[root][]&&!son[root][])
- {
- clear(root);
- root=;
- return ;
- }
- if(!son[root][])
- {
- int old=root;
- root=son[root][];
- fa[root]=;
- clear(old);
- return ;
- }
- else if(!son[root][])
- {
- int old=root;
- root=son[root][];
- fa[root]=;
- clear(old);
- return ;
- }
- int old=root,L=pre();
- splay(L);
- son[root][]=son[old][];
- fa[son[old][]]=root;
- clear(old);
- up(root);
- }
- void del_tree()
- {
- fa[son[root][]]=;
- size[root]-=size[son[root][]];
- son[root][]=;
- }
- inline int read()
- {
- int x=,f=;char ch=getchar();
- while(ch<''||ch>'')
- {if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<='')
- {x=(x<<)+(x<<)+ch-'';ch=getchar();}
- return x*f;
- }
- int main()
- {
- n=read();line=read();
- char op[];int val;
- for(int i=;i<=n;i++)
- {
- scanf("%s",op);val=read();
- switch(op[])
- {
- case 'I':
- if(val<line)break;
- else
- {
- ins(val-delta);
- break;
- }
- case 'A':
- delta+=val;break;
- case 'S':
- delta-=val;
- ins(line-delta);
- ans+=son[root][]?size[son[root][]]:;
- del_tree();
- del(val-delta);
- break;
- case 'F':
- if(size[root]<val)puts("-1");
- else printf("%d\n",getnum(size[root]-val+)+delta);
- break;
- }
- }
- cout<<ans<<endl;
- return ;
- }
郁闷的出纳员 题解(Splay)的更多相关文章
- Luogu1486郁闷的出纳员【Splay】
P1486 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...
- HNOI2004 郁闷的出纳员(Splay)
郁闷的出纳员 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的 ...
- BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】
一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题. 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点 ...
- 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)
bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...
- 【BZOJ】1503: [NOI2004]郁闷的出纳员(Splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=1503 这题没有看题解就1a了-好开心,, 其实后面去看题解发现他们的都很麻烦,其实有种很简单的做法: ...
- 【NOI2004】郁闷的出纳员(splay)
题面 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工 作,但是令人郁闷的是,我们的老板反复无 ...
- BZOJ1503:[NOI2004]郁闷的出纳员——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题面复制的洛谷的,因为洛谷好看) 题目描述 OIER公司是一家大型专业化软件公司,有着数以万 ...
- [BZOJ1503]郁闷的出纳员(Splay)
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- BZOJ1503: [NOI2004]郁闷的出纳员(Splay)
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...
随机推荐
- shell中的四种模式匹配
POSIX为shell为进行模式匹配提供了四种参数替换结构(老版本的shell可能不支持),每种结构有两个参数:变量名(或变量号)及模式. 第一种模式: ${variable%pattern}, ...
- bzoj2186【SDOI2008】沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2363 Solved: 779 [id=2186& ...
- 【大话QT之十四】QT实现多语言切换
功能需求: 网盘client要可以实现多国语言的切换,第一版要支持中.英文的切换. 在实现过程中感觉QT对多国语言的支持还是非常不错的.制作多语言包非常方便.切换的逻辑也非常easy. 以下就来看一下 ...
- css中合理的使用nth-child实现布局
写这篇文章的目的.主要是今天要实现一个布局:li.每行三个,总数不定.仅仅能相邻的li之间须要10px的间距.效果例如以下图: watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- Date类型转换为Integer类型
Date类型转换为Integer类型: Integer date = Integer.valueOf(String.valueOf(new SimpleDateFormat("yyyyMMd ...
- 微软公有云Azure是惠及全人类的计算资源
回归往事,1975年,微软以DOS创业.在随后的三十年中,微软给人类贡献了视窗操作系统Windows,至今,人们对桌面操作系统XP仍然不离不弃.可是,面对互联网的兴起.微软应该怎么办呢? 微软内部不乏 ...
- Codeforces Round #327 (Div. 2)C. Median Smoothing 构造
C. Median Smoothing A schoolboy named Vasya loves reading books on programming and mathematics. He ...
- Polymorphism (C# Programming Guide)
https://msdn.microsoft.com/en-us/library/ms173152.aspx Polymorphism is often referred to as the thir ...
- yistack
- 解决 EF where<T>(func) 查询的一个性能问题
前两年帮朋友 做了个网吧管理软件,采用动软的三层架构 sql语句生成的.最近因功能变更 要改动,而我这段正在做asp.net mvc +ef+autofac的一个电商网站.索性 就把原来的底层全重新了 ...