BZOJ 1503 treap
思路:
treap (算是基本操作吧…..)
加减的操作数很少 就暴力好啦
每回判断一下最小的数是不是比M小
如果是 就删,继续判断
搞定。
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,M,xx,size,root,jy,ans;
char op[3];
struct Treap{int ch[2],rnd,cnt,sz,v;}tr[300050];
void Upd(int k){tr[k].sz=tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz+tr[k].cnt;}
void rot(int &k,bool f){int t=tr[k].ch[f];tr[k].ch[f]=tr[t].ch[!f],tr[t].ch[!f]=k,Upd(k),Upd(t),k=t;}
void insert(int &k,int num){if(!k){k=++size;tr[k].sz=tr[k].cnt=1,tr[k].v=num,tr[k].rnd=rand();return;}tr[k].sz++;if(tr[k].v==num){tr[k].cnt++;return;}bool f=num>tr[k].v;insert(tr[k].ch[f],num);if(tr[tr[k].ch[f]].rnd<tr[k].rnd)rot(k,f);
}
void dfs(int k,int num){tr[k].v+=num;if(tr[k].ch[0])dfs(tr[k].ch[0],num);if(tr[k].ch[1])dfs(tr[k].ch[1],num);
}
int rank(int k,int num){if(tr[tr[k].ch[1]].sz>=num)return rank(tr[k].ch[1],num); else if(tr[tr[k].ch[1]].sz+tr[k].cnt>=num)return tr[k].v;else return rank(tr[k].ch[0],num-tr[tr[k].ch[1]].sz-tr[k].cnt);
}
int get_min(int k){if(tr[k].ch[0])return get_min(tr[k].ch[0]);return tr[k].v;
}
void del(int &k,int num){if(tr[k].v==num){if(tr[k].cnt>1)tr[k].cnt--,tr[k].sz--;else if(tr[k].ch[0]*tr[k].ch[1]==0)k=max(tr[k].ch[0],tr[k].ch[1]);else rot(k,tr[tr[k].ch[0]].rnd>tr[tr[k].ch[1]].rnd),del(k,num);}else tr[k].sz--,del(tr[k].ch[num>tr[k].v],num);
}
int main(){scanf("%d%d",&n,&M);for(int i=1;i<=n;i++){scanf("%s%d",op,&xx);if(op[0]=='I'){if(xx>=M)insert(root,xx);}else if(op[0]=='S')dfs(root,-xx);else if(op[0]=='A')dfs(root,xx);else {if(xx<=tr[root].sz)printf("%d\n",rank(root,xx));else puts("-1");}while(tr[root].sz&&(jy=get_min(root))<M)ans++,del(root,jy);}printf("%d\n",ans);
}
转载于:https://www.cnblogs.com/SiriusRen/p/6532155.html
BZOJ 1503 treap相关推荐
- BZOJ 1503: [NOI2004]郁闷的出纳员 Treap
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- BZOJ 1503 [NOI2004] 郁闷的出纳员 treap
题意: 链接 方法: treap 解析: 这是本蒟蒻的第二道treap题,第二遍写的时候update,左旋右旋,插入函数都可以大概写出来了(还是得练啊),然而del 函数却被虐了,自己也想到用个什么 ...
- BZOJ 1503 郁闷的出纳员(splay)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...
- BZOJ 3544 treap (set)
我只是想找个treap的练习题-- 每回找到lower_bound 就好啦 //By SiriusRen #include <cstdio> #include <cstring> ...
- bzoj 1503 郁闷的出纳员 (平衡树+前缀和)
题意 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资. ...
- [BZOJ]1503: [NOI2004]郁闷的出纳员
SB平衡树 #include<cstdio> #define MN 100000 #define L(x) c[x][0] #define R(x) c[x][1] #define rtf ...
- BZOJ 3224 Treap
部分还没调到满意的程度,效率比splay略好 #include<bits/stdc++.h> using namespace std; const int maxn = 1e6+11; u ...
- bzoj 1503 (权值线段树)
由于蒟蒻实在是ttttttai 菜了,于是开始了学习主席树,权值线段树作为主席树的前置知识,于是蒟蒻各种百度百度,谷歌谷歌,抄网上的代码,然后终于A了这个题目.也还算是有一点收获. 题目:芝麻开门 题 ...
- BZOJ 3224: Tyvj 1728 普通平衡树【Treap】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一些数 ...
最新文章
- 面试官如何判断面试者的机器学习水平?
- tensorflow中keep_prob的修改方法
- 【硬件】运放的那些事儿
- promise学习记录
- 批处理start命令学习
- 关于MySQL使用Float存储时的精度问题
- 插入始终是1_插入式电磁流量计特点与应用
- Java web后端7JSTL
- github可视化工具_Github标星2.6K!微软开源的可视化工具,未免太酷炫了吧
- HTML CSS——margin和padding的学习
- python实用技巧(一)
- 关于 TCP window size
- Photoshop CC 2018 软件安装包+破解教程(转)
- Windows无法启动MapGIS DataStorage Service服务
- Tcl经典报错之 —— variable references require preced
- 已解决(Python运行报错)SyntaxError: expression cannot contain assignment, perhaps you meant “==“?
- 不换门可以改开门的方向吗_防盗门可以更改开门方向吗?
- PPT打开之后不能编辑,怎么解决?
- idea如何配置或者创建mybatis的xml文件 idea如何配置或者创建mybatis的配置文件
- 计算机三级可以入东莞户口吗,初中的家长注意了,非东莞户籍在东莞中考读高中,必须满足3个条件!...
热门文章
- CTFshow 命令执行 web30
- poj 3349 雪花
- 图像中添加二项式分布噪声
- c++派生类和基类的构造函数和析构函数
- 第二章:2.6 LTI系统特性与单位冲击信号的关系
- linux内核 header.s,Linux启动代码header.S研究
- python学习笔记四-列表
- 练习二十一:关于猴子吃桃的问题
- Androidstudio 使用git插件提交代码
- Unable to load the Wrapper's native library because none of the following files及解决方法