[Luogu1801] 黑匣子 - Treap
Description
Black Box是一种原始的数据库。它可以储存一个整数数组,还有一个特别的变量i。最开始的时候Black Box是空的.而i等于0。这个Black Box要处理一串命令。
命令只有两种:
ADD(x):把x元素放进BlackBox;
GET:i加1,然后输出Blackhox中第i小的数。
记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素。
现在要求找出对于给定的命令串的最好的处理方法。ADD和GET命令分别最多200000个。现在用两个整数数组来表示命令串:
A(1),A(2),…A(M):一串将要被放进Black Box的元素。每个数都是绝对值不超过2000000000的整数,M<=200000。
u(1),u(2),…u(N):表示第u(j)个元素被放进了Black Box里后就出现一个GET命令。输入数据不用判错。
Input&Output
Input
第一行,两个整数,M,N。
第二行,M个整数,表示A(l)......A(M)。
第三行,N个整数,表示u(l)......u(N)。
Output
输出Black Box根据命令串所得出的输出串,一个数字一行。
Sample
Input
7 4
3 1 -4 2 8 -1000 2
1 2 6 6
Output
3
3
1
2
Solution
题目要求支持插入和按排名查询,可以考虑用treap维护。
注意不要一开始插入所有元素,用一个计数器记录当前插入过的最后一个元素,跟随查询指令更新平衡树,再输出答案即可,详见代码。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<ctime>
#include<cstdlib>
#define maxn 200005
using namespace std;
struct node{
int v,w;
int l,r;
int size,k;
node(){l=r=size=k=0;}
}t[maxn];
int rt,cnt,ans;
void New(int &p,int x)
{
p=++cnt;
t[p].v=x;
t[p].w=rand();
t[p].size=t[p].k=1;
}
void pushup(int p)
{
t[p].size=t[t[p].l].size+t[t[p].r].size+t[p].k;
}
void lturn(int &p)
{
int q=t[p].r;
t[p].r=t[q].l;t[q].l=p;
p=q;
pushup(t[p].l);
pushup(p);
}
void rturn(int &p)
{
int q=t[p].l;
t[p].l=t[q].r;t[q].r=p;
p=q;
pushup(t[p].r);
pushup(p);
}
void Insert(int &p,int x)
{
if(p==0){
New(p,x);
return;
}
t[p].size++;
if(t[p].v==x)t[p].k++;
else if(t[p].v<x){
Insert(t[p].r,x);
if(t[t[p].r].w<t[p].w)lturn(p);
}
else {
Insert(t[p].l,x);
if(t[t[p].l].w<t[p].w)rturn(p);
}
}
int query(int p,int x)
{
if(p==0)return 0;
else if(x<=t[t[p].l].size)
return query(t[p].l,x);
else if(x>t[t[p].l].size+t[p].k)
return query(t[p].r,x-(t[t[p].l].size+t[p].k));
else return t[p].v;
}
int n,m,a[maxn],q;
int main()
{
srand(time(NULL));
scanf("%d%d",&n,&m);
int ptr=0;
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
for(int j=1;j<=m;++j){
scanf("%d",&q);
for(int k=ptr+1;k<=q;++k)
Insert(rt,a[k]);
ptr=q;
printf("%d\n",query(rt,j));
}
return 0;
}
[Luogu1801] 黑匣子 - Treap的更多相关文章
- luogu1801 黑匣子
惊了呀 Splay Treap 这都什么玩意 两个优先队列搞定 #include <bits/stdc++.h> using namespace std; #define LL long ...
- [日常摸鱼]Luogu1801 黑匣子(NOI导刊)
题意:写一个数据结构,要求滋兹两种操作,ADD:插入一个数,GET:令$i++$然后输出第$i$小的数 这个数据结构当然是平衡树啦!(雾) 写个Treap直接过掉啦- #include<cstd ...
- P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- fhq treap最终模板
新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1318 Solved: 498[Submit][ ...
- 非旋treap模板
bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- [普通平衡树treap]【学习笔记】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9046 Solved: 3840[Submit][Sta ...
随机推荐
- Hadoop搭建全程
修改配置文件 cd /etc/sysconfig/network-scripts #进入网络配置目录 dir ifcfg* #找到网卡配置文件 ifc ...
- java--补全诗句代码
代码效果: 代码: import java.util.Scanner; /* 补全诗句 */ public class game1 { public static void main(String[] ...
- java报错排解
1.eclipse新安装第一次启动报错: Javawas started but returned exit code=13-- 这是由于JDK和eclipse和电脑的位数不一致所致,要么都为32位, ...
- RxJS速成 (上)
What is RxJS? RxJS是ReactiveX编程理念的JavaScript版本.ReactiveX是一种针对异步数据流的编程.简单来说,它将一切数据,包括HTTP请求,DOM事件或者普通数 ...
- canvas填充样式
填充样式主要针对fillStyle.fillStyle除了可以赋值为color,还可以赋值渐变色,包括线性渐变色和径向渐变色,还是和css3里的内容类似. 一.线性渐变 1.设置线性渐变的填充样式 设 ...
- APK Multi-Tool强大的APK反编译工具终极教程
一.APK Multi-Tool介绍 APK Multi-Tool 是APK Manager的升级版,是一个强大的APK反编译工具,集多种功能于一身,是居家必备.做ROM必选的工具! 这是 ...
- (转)SQLite内置函数
一.聚合函数: SQLite中支持的聚合函数在很多其他的关系型数据库中也同样支持,因此我们这里将只是给出每个聚集函数的简要说明,而不在给出更多的示例了.这里还需要进一步说明的是,对于所有聚合函数而言, ...
- 敏捷冲刺每日报告——Day1
1.情况简述 Alpha阶段第一次Scrum Meeting 敏捷开发起止时间 2017.10.25 00:00 -- 2017.10.26 00:00 讨论时间地点 2017.10.25晚9:30, ...
- 数据结构基础——指针及动态内存分配(malloc)
一.指针 C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数.但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的 ...
- 使用Putty连接Amazon EC2 Instance
Amazon的EC2中,默认是不允许使用用户名和密码直接连接Instance的,而是通过AWS (Amazon Web Service)提供的证书.在第一次使用EC2的时候,AWS会要求你创建一个证书 ...