题目链接:

第K大区间2

基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160

定义一个长度为奇数的区间的值为其所包含的的元素的中位数。中位数_百度百科

现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少。

样例解释:

[l,r]表示区间的值
[1]:3
[2]:1
[3]:2
[4]:4
[1,3]:2
[2,4]:2

第三大是2

Input
  1. 第一行两个数nk(1<=n<=100000,k<=奇数区间的数量)
  2. 第二行n个数,0<=每个数<2^31
Output
  1. 一个数表示答案。
Input示例
  1. 4 3
  2. 3 1 2 4
Output示例
  1. 2
  2.  
  3. 题意:
  4.  
  5. 思路:
  6.  
  7. 二分答案t,统计中位数大于等于t的区间有多少个。
设a[i]为前i个数中有a[i]个数>=t,若奇数区间[l,r]的中位数>=t,则(a[r]-a[l-1])*2>r-l+1,即(a[r]*2-r)>(a[l-1]*2-l+1)。
设b[i]=a[i]*2-i,统计每个b[i]有多少个b[j]<b[i](j<i 且 j和i奇偶性不同)
总复杂度O(nlognlogn)
  1.  
  2. AC代码:
  1. //#include <bits/stdc++.h>
  2. #include <vector>
  3. #include <iostream>
  4. #include <queue>
  5. #include <cmath>
  6. #include <map>
  7. #include <cstring>
  8. #include <algorithm>
  9. #include <cstdio>
  10.  
  11. using namespace std;
  12. #define Riep(n) for(int i=1;i<=n;i++)
  13. #define Riop(n) for(int i=0;i<n;i++)
  14. #define Rjep(n) for(int j=1;j<=n;j++)
  15. #define Rjop(n) for(int j=0;j<n;j++)
  16. #define mst(ss,b) memset(ss,b,sizeof(ss));
  17. typedef long long LL;
  18. template<class T> void read(T&num) {
  19. char CH; bool F=false;
  20. for(CH=getchar();CH<''||CH>'';F= CH=='-',CH=getchar());
  21. for(num=;CH>=''&&CH<='';num=num*+CH-'',CH=getchar());
  22. F && (num=-num);
  23. }
  24. int stk[], tp;
  25. template<class T> inline void print(T p) {
  26. if(!p) { puts(""); return; }
  27. while(p) stk[++ tp] = p%, p/=;
  28. while(tp) putchar(stk[tp--] + '');
  29. putchar('\n');
  30. }
  31.  
  32. const LL mod=1e9+;
  33. const double PI=acos(-1.0);
  34. const LL inf=1e10;
  35. const int N=1e5+;
  36.  
  37. int n,k;
  38. int a[N],b[N],sum[][N];
  39.  
  40. int lowbit(int x)
  41. {
  42. return x&(-x);
  43. }
  44. void update(int x,int flag)
  45. {
  46. while(x<=n)
  47. {
  48. sum[flag][x]++;
  49. x+=lowbit(x);
  50. }
  51. }
  52. int query(int x,int flag)
  53. {
  54. int s=;
  55. while(x>)
  56. {
  57. s+=sum[flag][x];
  58. x-=lowbit(x);
  59. }
  60. return s;
  61. }
  62.  
  63. struct node
  64. {
  65. int temp,pos,id;
  66. }po[N];
  67. int cmp1(node x,node y)
  68. {
  69. if(x.temp==y.temp)return x.pos<y.pos;
  70. return x.temp<y.temp;
  71. }
  72. int cmp2(node x,node y)
  73. {
  74. return x.pos<y.pos;
  75. }
  76. int check(LL x)
  77. {
  78. mst(sum,);
  79. Riep(n)
  80. {
  81. b[i]=b[i-]+(a[i]>=x?:);
  82. po[i].temp=*b[i]-i;
  83. po[i].pos=i;
  84. }
  85. sort(po+,po+n+,cmp1);
  86. Riep(n)po[i].id=i;
  87. sort(po+,po+n+,cmp2);
  88. LL ans=;
  89. Riep(n)
  90. {
  91. if(po[i].temp>&&i%==)ans++;//包括0的;
  92. ans=ans+query(po[i].id,i&^);
  93. update(po[i].id,i&);
  94. }
  95. if(ans>=k)return ;
  96. return ;
  97. }
  98.  
  99. int main()
  100. {
  101. read(n);read(k);
  102. Riep(n)read(a[i]);
  103. LL l=,r=inf;
  104. while(l<=r)
  105. {
  106. LL mid=(l+r)>>;
  107. if(check(mid))l=mid+;
  108. else r=mid-;
  109. }
  110. print(l-);
  111. return ;
  112. }

51nod 第K大区间2(二分+树状数组)的更多相关文章

  1. ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  2. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  3. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  4. hdu-5700 区间交(二分+树状数组)

    题目链接: 区间交 Problem Description   小A有一个含有n个非负整数的数列与mm个区间.每个区间可以表示为l​i​​,r​i​​. 它想选择其中k个区间, 使得这些区间的交的那些 ...

  5. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

  6. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  7. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  8. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  9. CodeForces992E 二分 + 树状数组(线段树)

    http://codeforces.com/problemset/problem/992/E 题意:给定一个序列 ai​ ,记其前缀和序列为 si​ ,有 q 个询问,每次单点修改,询问是否存在一个  ...

随机推荐

  1. Minus-C 一个最小化的C语言规范

    资深C++程序员都不会对C++编程规范太陌生,C++实在太复杂,以至于所有项目都需要裁剪一个子集共项目组内使用.经过在家休息这一小段时间,我发现其实C语言更需要一个相同的规范,这就是本文的目标,最大可 ...

  2. Oracle Job相关

    Oracle JOB的建立,定时执行任务      begin            sys.dbms_job.submit(job => :job,                       ...

  3. easyui combobox筛选(拼音)

    1.combobox本身的筛选 $('#cc').combobox({ filter: function(q, row){ var opts = $(this).combobox('options') ...

  4. 用CToolBarCtrl类为对话框创建工具栏

    ---恢复内容开始--- 首先CToolBarCtrl类内部维护了三个重要的数据结构:一个图像列表,一个字符串列表,一个TBBUTTON结构体的列表. 知道了这一点,下面的理解起来就轻松了.慢慢来: ...

  5. C++ Bit Fields

    http://msdn.microsoft.com/en-us/library/ewwyfdbe%28v=vs.71%29.aspx Note An unnamed bit field of widt ...

  6. 对Slony-I中wait on的理解

    http://slony.info/documentation/2.1/advanced.html#AEN1425 4.1.2. Event Confirmations When an event i ...

  7. UIImage imageNamed 与 imageWithContentsOfFile的差别

    [UIImage imageNamed:]仅仅适合与UI界面中的贴图的读取,较大的资源文件应该尽量避免使用 用UIImage载入本地图像最经常使用的是以下三种: 1.用imageNamed方法 [UI ...

  8. arp:地址解析协议(Address Resolution Protocol)(来自维基百科)

    地址解析协议(Address Resolution Protocol),其基本功能为通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在I ...

  9. 转换到 COFF 期间失败: 文件无效或损坏 解决方法

    转自csdn 终极解决方案:VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输 ...

  10. 王立平--EditPlus激活码

    注冊名:Free User 注冊码:6AC8D-784D8-DDZ95-B8W3A-45TFA