二分查找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大的数 两种方法相关推荐

  1. Swaps and Inversions hdu多校训练第二场 树状数组求逆序数+离散化

    http://acm.hdu.edu.cn/showproblem.php?pid=6318 交换相邻的元素,有几个逆序对,就交换几次使其变成顺序对 #include<bits/stdc++.h ...

  2. 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间

    从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...

  3. 【BZOJ】1012: [JSOI2008]最大数maxnumber 树状数组求区间最值

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1012 题意:维护一个数列,开始时没有数值,之后会有两种操作, Q L :查询数列末 ...

  4. 树状数组求区间和(区间均值)

    1658: O__O "- 就是那道中文题 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Descri ...

  5. ZOJ - 4117 BaoBao Loves Reading(树状数组求区间内不同数的个数+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,其意义为第 i 秒需要看第 a[ i ] 种书,书架上可以供应无限种书,但是书桌有容量,当书桌上的容量达到上限后,如果还想从书架上拿新书来看, ...

  6. [Split The Tree][dfs序+树状数组求区间数的种数]

    Split The Tree 时间限制: 1 Sec  内存限制: 128 MB 提交: 46  解决: 11 [提交] [状态] [讨论版] [命题人:admin] 题目描述 You are giv ...

  7. 树状数组求区间和 和 单点更新

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  8. hdu1754(树状数组求最值问题)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 树状数组维护区间和的模型及其拓广的简单总结

    by wyl8899 树状数组的基本知识已经被讲到烂了,我就不多说了,下面直接给出基本操作的代码. 假定原数组为a[1..n],树状数组b[1..n],考虑灵活性的需要,代码使用int *a传数组. ...

最新文章

  1. * 执行多条更新的Sql语句
  2. PXE网络装机之centos7(批量自动装机)
  3. 基础数学:通俗解释,啥叫随机变量?
  4. css实现页面文字不换行、自动换行、强制换行
  5. Linux centos7安装nfs及服务端配置
  6. c++ list 修改_ggplot2 修改图例的一些操作
  7. mongodb防火墙配置
  8. Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence
  9. xpath里面if判断一个值不为空_现代C++之模板元编程(今天写个If与While)
  10. DevOps落地三部曲:如何归责?用啥工具?往哪里去?
  11. SQL Server LIKE语句使用举例
  12. 读嵌入式linux驱动程序设计从入门到精通1
  13. 宇视智能交通常见的补光灯有哪些?
  14. 纬地服务器找不带计算机,纬地V6.9升级启动解决方法大全
  15. python实战演练一:抓取我自己csdm博客信息的标题和文章链接,并存入文件夹《抓取信息》
  16. Excel插件POI-ET扩展(NiceXSSFWorkbook)说明
  17. MD5加密算法原理及实现
  18. 图像的频谱图简单理解
  19. 二、AFD-Net: Aggregated Feature Difference Learning for Cross-Spectral Image Patch Matching论文阅读
  20. SHELL编程基础 By jackie

热门文章

  1. 《C语言程序设计基础》第2章作业,清华大学出版社-图书详情-《C语言程序设计基础实验与题解》...
  2. echart的关系图高亮_echarts鼠标覆盖高亮显示节点及关系名称详解
  3. xib与nib的区别
  4. c语言二重循环的盒图怎么画,全国计算机二级C语言程序设计讲义 循环嵌套.ppt...
  5. 吉大c 语言程序设计奥鹏作业,吉大20春学期《可编程控制器》在线作业一百分...
  6. 部署FTP服务器及其管理
  7. 【PHPWord】页面添加图片水印
  8. 【教程】2、读取新闻条目
  9. python-docx 使用教程_python docx 中文字体设置的操作方法
  10. 架空输电线路运行规程_架空输电线路导、地线安全系数的规定