Bsoj 1322 第K小数
第K小数
Description
现在已有N个整数,你有以下三种操作:
1 A:表示加入一个值为A的整数;
2 B:表示删除其中值为B的整数;
3 K:表示输出这些整数中第K小的数;
Input
第一行,两个整数N,M,表示最开始有N个整数,总共有M个操作
第二行用空格隔开的N个整数
接下来M行,每行表示一个操作
Output
若干行,一行一个整数,表示所求的第K小的数字
Sample Input
5 5
6 2 7 4 9
1 8
1 6
3 10
2 4
3 3
Sample Output
0
7
Hint
【注意】:如果有多个大小相同的数字,只把他们看做一个数字,如样例。 若找不到第K小的数,输出0
【数据范围】
0<=N<=2,000,000
M<=1,000,000
-1,000,000,000<=每个整数<=1,000,000,000
写个普通的treap就好
- /*by SilverN*/
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- int n,m;
- struct treap{
- int l,r;//左右子树
- int val,ct;//值 重复次数
- int size,rand;//管控数量,随机权值
- }t[];
- int root=,cnt=;
- int ans;
- void update(int k){
- t[k].size=t[t[k].l].size+t[t[k].r].size+t[k].ct;
- }
- void lt(int &k){//左旋
- int now=t[k].r;
- t[k].r=t[now].l;
- t[now].l=k;
- t[now].size=t[k].size;
- update(k);
- k=now;
- return;
- }
- void rt(int &k){
- int now=t[k].l;
- t[k].l=t[now].r;
- t[now].r=k;
- t[now].size=t[k].size;
- update(k);
- k=now;
- return;
- }
- void insert(int &k,int x){
- if(k==){
- t[++cnt].val=x;
- t[cnt].size=;
- t[cnt].ct=;
- t[cnt].rand=rand();
- k=cnt;
- return;
- }
- t[k].size++;
- if(t[k].val==x) return;//多个重复数字看做一个
- else if(x>t[k].val){
- insert(t[k].r,x);
- if(t[t[k].r].rand<t[k].rand) lt(k);
- }else{//x<t[k].val
- insert(t[k].l,x);
- if(t[t[k].l].rand<t[k].rand) rt(k);
- }
- return;
- }
- void del(int &k,int x){
- if(k==)return;
- if(t[k].val==x){
- if(t[k].ct>){t[k].ct--;t[k].size--;return;}
- if(t[k].l*t[k].r==)k=t[k].l+t[k].r;//如果k是链结点(只有一个子节点),由其子节点补位
- else{
- if(t[t[k].l].rand<t[t[k].r].rand){
- rt(k);
- del(k,x);
- }
- else{
- lt(k);
- del(k,x);
- }
- }
- return;
- }
- t[k].size--;
- if(x>t[k].val)del(t[k].r,x);
- if(x<t[k].val)del(t[k].l,x);
- return;
- }
- int ask_num(int k,int x){// 已知排名问数字
- if(!k)return ;
- if(x<=t[t[k].l].size)return ask_num(t[k].l,x);//排名小于左子树包含结点数量,则往左查
- if(x>t[t[k].l].size+t[k].ct)return ask_num(t[k].r,x-t[t[k].l].size-t[k].ct);
- //排名大于“左子树结点数加父结点重复数”,则往右查
- else return t[k].val;//否则返回父结点值
- }
- int main(){
- int opt,x;
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++){
- scanf("%d",&x);
- insert(root,x);
- }
- while(m--){
- scanf("%d%d",&opt,&x);
- switch(opt){
- case : insert(root,x); break;
- case : del(root,x); break;
- case : printf("%d\n",ask_num(root,x));break;
- }
- // for(int i=1;i<=cnt;i++)printf("%d ",t[i].val);
- // cout<<endl;
- }
- return ;
- }
Bsoj 1322 第K小数的更多相关文章
- 第K 小数
[问题描述]有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少.[输入格式]输入文件名为number.in.输入文件包 ...
- 数组第K小数问题 及其对于 快排和堆排 的相关优化比较
题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...
- 算法打基础——顺序统计(找第k小数)
这次主要是讲如何在线性时间下找n个元素的未排序序列中第k小的数.当然如果\(k=1 or k=n\),即找最大最小 数,线性时间内遍历即可完成,当拓展到一般,如中位数时,相关算法就值得研究了.这里还要 ...
- 查找第K小数
题目描述 查找一个数组的第K小的数,注意同样大小算一样大. 如 2 1 3 4 5 2 第三小数为3. 输入描述: 输入有多组数据.每组输入n,然后输入n个整数(1<=n<=1000), ...
- OJ2237第k小数题解
题目描述: 有n个数,请你找出第k小的数. 输入描述: 第一行有2个正整数n,k(n,k<=10^7)第二行有n个非负数ai(ai<=10^5) 输出描述: 输出第k小的数. 输入样例: ...
- 【递归打卡2】求两个有序数组的第K小数
[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度分别为 m1 和 m2,求两个数组中的第 K 小数.要求时间复杂度O(log(m1 + m2)). [举例] 例如 arr1 = [1, ...
- 两个有序数组的上中位数和第K小数问题
哈,再介绍个操蛋的问题.当然,网上有很多解答,但是能让你完全看懂的不多,即便它的结果是正确的,可是解释上也是有问题的. 所以,为了以示正听,我也做了分析和demo,只要你愿意学习,你就一定能学会,并且 ...
- 2018.07.08 NOIP模拟 第K小数(二分)
第K小数 题目背景 SOURCE:NOIP2016-AHSDFZ T1 题目描述 有两个正整数数列,元素个数分别为 N 和 M .从两个数列中分别任取一个数相乘,这样一共可以得到 N*M 个数,询问这 ...
- JZOJ 10043 第k小数
Description 有两个非负整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到NM个数,询问这NM个数中第K小数是多少. 时间限制为20ms . Input 输入文 ...
随机推荐
- MongoDB学习(二)Windows环境安装MongoDB
MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的程序下来. 在下载页面可以看到,对操作系统支持很全面,OS X.Linux.Windo ...
- java 16 - 9 增强for的概述和使用
JDK5的新特性:自动拆装箱,泛型,增强for,静态导入,可变参数,枚举 增强for:是for循环的一种. 格式: for(元素数据类型 变量 : 数组或者Collection集合) { 使用变量即可 ...
- Android Parcelable和Serializable的区别,androidparcelable
本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...
- Linq中查询List组合相同值数量大于1
List< select g.Key).ToList();
- javascript:让表单 文本框 只读,不可编辑的方法
有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使<input type="text" name="input1" value=&qu ...
- Entity Framework版本历史概览
转自:http://www.cnblogs.com/fecktty2013/archive/2014/09/26/entityframework-overview.html EF版本 .net fra ...
- OpenGL 4.3配置教程
OpenGL 4.3配置教程 下载开发包 需要下载的开发包主要包含如下几个组件:freeglut+glew+ OpenGL.Development.Cookbook+源码+GLM+SOIL. Open ...
- DWZ(JUI)的lookupGroup增加回调函数
DWZ 是一个很好的富客户端框架 lookupGroup也是一个必用到的东东,但没有回调函数,后期处理相当的不便. 修改其dwz.database.js 增加几行,就能实行一个很好的回调. 使用就方便 ...
- list to csv
import csv # ============================== # list to csv # ============================== a = [1,2, ...
- .NET面试题解析(07)-多线程编程与线程同步 (转)
http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...