1322 -- 【练习试题】第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 91 81 63 102 43 3

Sample Output

07

Hint

【注意】:如果有多个大小相同的数字,只把他们看做一个数字,如样例。 若找不到第K小的数,输出0
【数据范围】
0<=N<=2,000,000
M<=1,000,000
-1,000,000,000<=每个整数<=1,000,000,000
【题目分析】
又是一道简单的模板题,但是由于我太困了,不想思考到底在哪里up它的值了,然而up并不影响时间复杂度。我就多加了几个(#(滑稽))。
【代码】
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
using namespace std;
struct node{int l,r,size,v,rnd;
}tr[2010000];
int root=0,cnt=0,ans=0;
inline void up(int k)
{tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+1;}
inline void rturn(int &k)
{int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;tr[t].size=tr[k].size;up(k);up(t);k=t;
}
inline void lturn(int &k)
{int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;tr[t].size=tr[k].size;up(k);up(t);k=t;
}
inline void ins(int &k,int x)
{if (k==0){++cnt;k=cnt;tr[k].v=x;tr[k].rnd=rand();tr[k].size=1;return;}if (x==tr[k].v) return;up(k);if (x>tr[k].v){ins(tr[k].r,x);up(k);if (tr[tr[k].r].rnd>tr[k].rnd);lturn(k);up(k);return;}if (x<tr[k].v){ins(tr[k].l,x);up(k);if (tr[tr[k].l].rnd>tr[k].rnd);rturn(k);up(k);return;}
}
inline int qrank(int k,int x)
{if (k==0) return 0;if (x>tr[tr[k].l].size+1) return qrank(tr[k].r,x-tr[tr[k].l].size-1);else if (x<=tr[tr[k].l].size) return qrank(tr[k].l,x);else return tr[k].v;
}
inline void del(int & k,int x)
{if (k==0) return ;if (tr[k].v==x){if (tr[k].l*tr[k].r==0) k=tr[k].l+tr[k].r;else if (tr[tr[k].l].rnd>tr[tr[k].r].rnd) up(k),rturn(k),up(k),del(k,x),up(k);else up(k),lturn(k),up(k),del(k,x),up(k);return ;}up(k);if (tr[k].v>x) {del(tr[k].l,x);up(k);return;}else del(tr[k].r,x),up(k);
}
int main()
{int n,m;scanf("%d%d",&n,&m);for (int i=1;i<=n;++i) {int x;scanf("%d",&x);ins(root,x);}for (int i=1;i<=m;++i){int a,b;scanf("%d%d",&a,&b);switch(a){case 1:ins(root,b);break;case 2:del(root,b);break;case 3:printf("%d\n",qrank(root,b));break;}}
}

巴蜀OJ 1322 第K小数相关推荐

  1. 【九度OJ】查找第K小数

    题目 查找一个数组的第K小的数,注意同样大小算一样大. 如 2 1 3 4 5 2 第三小数为3. 输入 输入有多组数据. 每组输入n,然后输入n个整数(1<=n<=1000),再输入k. ...

  2. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

  3. nyoj 1261 音痴又音痴的LT(离散化+树状数组求K小数)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1261 解题思路:比较水的题,用离散化+树状数组求K小数即可,先用一次离线处理. #inc ...

  4. JZOJ 100043. 【NOIP2017提高A组模拟7.13】第K小数

    Description 有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少. Input 输入文件包含三行. 第一行为 ...

  5. UOJ #576. 积的第K小数

    [题目描述]:有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N×M个数,询问这N×M个数中第K小数是多少. [输入描述]:第一行为三个正整数N,M和K.第二行 ...

  6. [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)

    问题描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...

  7. jzoj4438 K小数查询

    Data Constraint n<=80000,所有数字的绝对值不超过5000000 Solution 这是一道分块的板题 但是并不是那么好写的 一般来说我们都按照根号n为块的大小进行分块 那 ...

  8. 题目1174:查找第K小数

    题目描述: 查找一个数组的第K小的数,注意同样大小算一样大. 如  2 1 3 4 5 2 第三小数为3. 输入: 输入有多组数据. 每组输入n,然后输入n个整数(1<=n<=1000), ...

  9. 【慢慢学算法】:查找第k小数

    题目描述: 查找一个数组的第K小的数,注意同样大小算一样大.  如  2 1 3 4 5 2 第三小数为3. 输入: 输入有多组数据. 每组输入n,然后输入n个整数(1<=n<=1000) ...

最新文章

  1. C++中引用的用法和应用实例
  2. k8s architecture
  3. [Linux实用工具]munin-node插件配置和插件编写
  4. python predict y和x是必须一致吗_数据科学python错误 - ValueError:x和y必须具有相同的第一维...
  5. 《零基础》MySQL NULL 值处理(二十一)
  6. 我的NopCommerce之旅(4): 定时任务之邮件
  7. 端到端加密优缺点_基于Filecoin的去中心化文件保存和加密分享平台
  8. java面试 谈谈jvm内存结构
  9. 首个万人远程培训项目顺利启动
  10. gflags 调试内存_windows下堆异常调试神器--gflags
  11. 有趣且有意义的数字,你想到了什么?请不吝留言
  12. CodeForces 285 E.Positions in Permutations(dp+组合数学)
  13. bfs+状压——朋也与光玉
  14. atcoder abc242 c题 1111gal password
  15. JavaScript - 四舍五入
  16. 先广度后深度,打开编程视野
  17. 中科大计算机网络空间安全,2020年中国科学技术大学网络空间安全考研经验分享...
  18. ASP.NET - Button、LinkButton和ImageButton
  19. 业务数据激增,4张图看清zData如何助力金融企业快速响应IT需求
  20. List的toArray方法强制转换

热门文章

  1. 零基础学黑客,该如何学习?附教程。
  2. 一道小学数学竞赛题:到底有几个三角形?
  3. vue2开发中$emit 、$on 、$once 、$off 的使用, vue中$root、$refs、$parent 的使用
  4. VSCode格式化保存HTML的标签名前(head,body,/html)自动空出一行的解决办法
  5. 【MyBatis-Plus】MyBatis-plus的注入器使用
  6. easyUI文本框获得焦点,失去焦点
  7. php怎么使得字体滚动,jq实现文字div块状无缝上移滚动效果
  8. iOS8 横竖屏控制
  9. 记一次Ucloud云数据库主从创建
  10. vue实例的属性和方法