hdu2852(2009多校第四场) 树状数组求区间第k大的数 两种方法
二分查找n*logn*logn
比较容易理解
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #define maxx 100005 5 using namespace std; 6 int vis[100010],c[100010],k; 7 int sum(int x) 8 { 9 int ret=0; 10 while (x>0){ 11 ret+=c[x]; 12 x-=(x&-x); 13 } 14 return ret; 15 } 16 void add(int x,int d) 17 { 18 while (x<=maxx){ 19 c[x]+=d; 20 x+=(x&-x); 21 } 22 } 23 int binery(int l,int r) 24 { 25 int mid=l+(r-l)/2,t1,t2,t3; 26 t1=sum(l); t2=sum(mid); t3=sum(r); 27 if (t1==t3) return l; 28 if (t2<k) return binery(mid+1,r); 29 else return binery(l,mid); 30 } 31 int main() 32 { 33 int n,x,y; 34 while (~scanf("%d",&n)) 35 { 36 memset(vis,0,sizeof(vis)); 37 memset(c,0,sizeof(c)); 38 while (n--) 39 { 40 scanf("%d",&x); 41 if (x==0) 42 { 43 scanf("%d",&y); 44 vis[y]++; 45 add(y,1); 46 } 47 else if (x==1) 48 { 49 scanf("%d",&y); 50 if (vis[y]==0){ 51 printf("No Elment!\n"); 52 continue; 53 } 54 vis[y]--; 55 add(y,-1); 56 } 57 else 58 { 59 scanf("%d%d",&y,&k); 60 if (sum(100000)-sum(y)<k){ 61 printf("Not Find!\n"); 62 continue; 63 } 64 k=sum(y)+k; 65 printf("%d\n",binery(1,100000)); 66 } 67 } 68 } 69 return 0; 70 }
View Code
利用树状数组自身的特点,和数的二进制拆分关系
神奇优美的nlogn方法
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #define maxx 100005 5 using namespace std; 6 int vis[100010],c[100010]; 7 int sum(int x) 8 { 9 int ret=0; 10 while (x>0){ 11 ret+=c[x]; 12 x-=(x&-x); 13 } 14 return ret; 15 } 16 void add(int x,int d) 17 { 18 while (x<=maxx){ 19 c[x]+=d; 20 x+=(x&-x); 21 } 22 } 23 int find_kth(int k) 24 { 25 int ans=0,cnt=0,i; 26 for (i=20;i>=0;i--) 27 { 28 ans+=(1<<i); 29 if (ans>=maxx||cnt+c[ans]>=k) 30 ans-=(1<<i); 31 else cnt+=c[ans]; 32 } 33 return ans+1; 34 } 35 int main() 36 { 37 int n,x,y,k; 38 while (~scanf("%d",&n)) 39 { 40 memset(vis,0,sizeof(vis)); 41 memset(c,0,sizeof(c)); 42 while (n--) 43 { 44 scanf("%d",&x); 45 if (x==0) 46 { 47 scanf("%d",&y); 48 vis[y]++; 49 add(y,1); 50 } 51 else if (x==1) 52 { 53 scanf("%d",&y); 54 if (vis[y]==0){ 55 printf("No Elment!\n"); 56 continue; 57 } 58 vis[y]--; 59 add(y,-1); 60 } 61 else 62 { 63 scanf("%d%d",&y,&k); 64 if (sum(100000)-sum(y)<k){ 65 printf("Not Find!\n"); 66 continue; 67 } 68 printf("%d\n",find_kth(sum(y)+k)); 69 } 70 } 71 } 72 return 0; 73 }
View Code
转载于:https://www.cnblogs.com/xiao-xin/articles/4166015.html
hdu2852(2009多校第四场) 树状数组求区间第k大的数 两种方法相关推荐
- Swaps and Inversions hdu多校训练第二场 树状数组求逆序数+离散化
http://acm.hdu.edu.cn/showproblem.php?pid=6318 交换相邻的元素,有几个逆序对,就交换几次使其变成顺序对 #include<bits/stdc++.h ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber 树状数组求区间最值
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1012 题意:维护一个数列,开始时没有数值,之后会有两种操作, Q L :查询数列末 ...
- 树状数组求区间和(区间均值)
1658: O__O "- 就是那道中文题 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Descri ...
- ZOJ - 4117 BaoBao Loves Reading(树状数组求区间内不同数的个数+思维)
题目链接:点击查看 题目大意:给出一个长度为 n 的序列,其意义为第 i 秒需要看第 a[ i ] 种书,书架上可以供应无限种书,但是书桌有容量,当书桌上的容量达到上限后,如果还想从书架上拿新书来看, ...
- [Split The Tree][dfs序+树状数组求区间数的种数]
Split The Tree 时间限制: 1 Sec 内存限制: 128 MB 提交: 46 解决: 11 [提交] [状态] [讨论版] [命题人:admin] 题目描述 You are giv ...
- 树状数组求区间和 和 单点更新
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- hdu1754(树状数组求最值问题)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 树状数组维护区间和的模型及其拓广的简单总结
by wyl8899 树状数组的基本知识已经被讲到烂了,我就不多说了,下面直接给出基本操作的代码. 假定原数组为a[1..n],树状数组b[1..n],考虑灵活性的需要,代码使用int *a传数组. ...
最新文章
- * 执行多条更新的Sql语句
- PXE网络装机之centos7(批量自动装机)
- 基础数学:通俗解释,啥叫随机变量?
- css实现页面文字不换行、自动换行、强制换行
- Linux centos7安装nfs及服务端配置
- c++ list 修改_ggplot2 修改图例的一些操作
- mongodb防火墙配置
- Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence
- xpath里面if判断一个值不为空_现代C++之模板元编程(今天写个If与While)
- DevOps落地三部曲:如何归责?用啥工具?往哪里去?
- SQL Server LIKE语句使用举例
- 读嵌入式linux驱动程序设计从入门到精通1
- 宇视智能交通常见的补光灯有哪些?
- 纬地服务器找不带计算机,纬地V6.9升级启动解决方法大全
- python实战演练一:抓取我自己csdm博客信息的标题和文章链接,并存入文件夹《抓取信息》
- Excel插件POI-ET扩展(NiceXSSFWorkbook)说明
- MD5加密算法原理及实现
- 图像的频谱图简单理解
- 二、AFD-Net: Aggregated Feature Difference Learning for Cross-Spectral Image Patch Matching论文阅读
- SHELL编程基础 By jackie
热门文章
- 《C语言程序设计基础》第2章作业,清华大学出版社-图书详情-《C语言程序设计基础实验与题解》...
- echart的关系图高亮_echarts鼠标覆盖高亮显示节点及关系名称详解
- xib与nib的区别
- c语言二重循环的盒图怎么画,全国计算机二级C语言程序设计讲义 循环嵌套.ppt...
- 吉大c 语言程序设计奥鹏作业,吉大20春学期《可编程控制器》在线作业一百分...
- 部署FTP服务器及其管理
- 【PHPWord】页面添加图片水印
- 【教程】2、读取新闻条目
- python-docx 使用教程_python docx 中文字体设置的操作方法
- 架空输电线路运行规程_架空输电线路导、地线安全系数的规定