【NOI】2004 郁闷的出纳员
【算法】平衡树(treap)
【题解】
treap知识见数据结构。
解法,具体细节见程序。
#include<cstdio>
#include<algorithm>
#include<ctime>
using namespace std;
const int maxn=;
struct cyc{int l,r,rnd,s,num;}t[maxn*];
int n,sz,low,root,delta;
void rturn(int &tt)
{
int k=t[tt].l;
t[tt].l=t[k].r;
t[k].r=tt;
t[k].s=t[tt].s;
t[tt].s=t[t[tt].l].s+t[t[tt].r].s+;
tt=k;
}
void lturn(int &tt)
{
int k=t[tt].r;
t[tt].r=t[k].l;
t[k].l=tt;
t[k].s=t[tt].s;
t[tt].s=t[t[tt].l].s+t[t[tt].r].s+;
tt=k;
}
void insert(int &k,int x)
{
if(k==)
{
k=++sz;
t[k].rnd=rand();
t[k].s=;//s表示该子树的节点个数(含本身)
t[k].num=x;
return;
}
t[k].s++;
if(x<t[k].num)
{
insert(t[k].l,x);
if(t[t[k].l].rnd<t[k].rnd)rturn(k);
}
else
{
insert(t[k].r,x);
if(t[t[k].r].rnd<t[k].rnd)lturn(k);
}
}
int del(int &k,int x)
{
int sum=;
if(k==)return ;
if(x>t[k].num){sum=t[t[k].l].s+;k=t[k].r;return sum+del(k,x);}//直接将根从k变为k的右子树,由于&的传递效果,相当于直接废了左子树和根节点,把右子树接上去。
else{sum=del(t[k].l,x);t[k].s-=sum;return sum;}
}
int find(int k,int x)
{
if(t[t[k].l].s+==x)return(t[k].num+delta);
if(x<=t[t[k].l].s)return(find(t[k].l,x));
else return(find(t[k].r,x-t[t[k].l].s-));
}
int main()
{
scanf("%d%d",&n,&low);
srand(time());
int ans=;
for(int i=;i<=n;i++)
{
char c=getchar();int rd;
while(c<'A'||c>'Z')c=getchar();
scanf("%d",&rd);
if(c=='I')if(rd>=low)insert(root,rd-delta);
if(c=='A')delta+=rd;
if(c=='S'){delta-=rd;ans+=del(root,low-delta);}
if(c=='F')
{
if(t[root].s<rd)printf("-1\n");
else printf("%d\n",find(root,t[root].s-rd+));
}
}
printf("%d",ans);
return ;
}
【NOI】2004 郁闷的出纳员的更多相关文章
- 数据结构(跳跃表):NOI 2004 郁闷的出纳员
郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...
- NOI 2004 郁闷的出纳员(平衡树)
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- NOI 2004 郁闷的出纳员
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 分析: 经典的平衡树题,我用Treap做的 下面有几点注意的: 1.可能出现新加入的人的 ...
- 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap
思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...
- bzoj 1503[NOI 2004] 郁闷的出纳员
题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...
- c++之路进阶——codevs1286(郁闷的出纳员)
1286 郁闷的出纳员 2004年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description OIER公司 ...
- BZOJ 1503: [NOI2004]郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 10526 Solved: 3685[Submit][Stat ...
- [BZOJ1503][NOI2004]郁闷的出纳员
[BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...
随机推荐
- ubuntu上的inpack测试
测试linpack 配置 配置linpack环境是整个过程中最麻烦的,也可能是因为我在配置的过程中出现了很多小问题吧.大概有3天的时间除了上课就在配置环境. 问题 总结起来问题和解决方法有这些 1.路 ...
- MVC4 DropDownList (一) — 使用方法
1.下面代码包含了三种绑定DropDownList的方法 using System; using System.Collections.Generic; using System.Linq; usin ...
- html .net 网页,网站标题添图标
<link rel="icon" href="../favicon.ico" type="image/x-icon" /> &l ...
- 3ds Max学习日记(一)
暑假闲来无事学习一发3ds Max.为啥要学这玩意?貌似可以用这东西三维建模.暑期生产实习选了一个搞vr的导师,貌似他忙得很,无奈只好先自己研究一下啦~ vr神马的还是有点意思的,虽然自己仅仅 ...
- PAT L1-044 稳赢
https://pintia.cn/problem-sets/994805046380707840/problems/994805086365007872 大家应该都会玩“锤子剪刀布”的游戏:两人同时 ...
- 【Docker 命令】- top命令
docker top :查看容器中运行的进程信息,支持 ps 命令参数. 语法 docker top [OPTIONS] CONTAINER [ps OPTIONS] 容器运行时不一定有/bin/ba ...
- centos7 下pycharm无法输入中文问题解决方案
作者使用的pycharm是2017.2 在pycharm.sh脚本的如下行(大约在201行): # -------------------------------------------------- ...
- matlab如何将数组中的NAN值去除
比如我们一组数据,里面有不少的NaN值,如何将其删除掉呢?可以通过find函数来搞定. 我们可以通过importdata('data.txt')将数据文件data.txt导入数组A中. ...
- 禁止移动端input弹出软键盘
在做三级联动,或者一些时间插件的时候总是弹出软键盘,用下面的方法就可以禁用掉,废话不多说直接上代码. HTML代码 <div class=""> <div> ...
- JavaScript中Switch使用
switch 语句用于基于不同的条件来执行不同的动作.使用 switch 语句来选择要执行的多个代码块之一. switch(n) { case 1: 执行代码块 1 break; case 2: 执行 ...