题目描述:

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

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

  样例解释:

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

  第三大是2

输入:

  第一行两个数n和k(1<=n<=100000,k<=奇数区间的数量) 第二行n个数,0<=每个数<2^31

输出:

  一个数表示答案。

题解:

  二分答案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] i与j奇偶性不同,BIT

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6+, M = 1e5+, mod = 1e9+, inf = 2e9;
typedef long long ll; int C[N][],n;
int a[N],b[N];
ll k;
void update(int x,int p) {
if(x==) return ;
for(int i=x;i<N;i+=i&(-i)) C[i][p]+=;
}
int getsum(int x,int p) {
int s = ;
for(int i=x;i;i-=i&(-i)) s+=C[i][p];
return s;
}
ll ask(int t)
{
memset(C,,sizeof(C));
b[]=;
for(int i=;i<=n;i++) b[i]=a[i]>=t?:,b[i]+=b[i-];
for(int i=;i<=n;i++) b[i] = b[i]*-i+M;
ll s=;
update(M,);
for(int i=;i<=n;i++) {
s+=getsum(b[i],(i&)^);
update(b[i],(i&));
}
return s;
}
int main(){
scanf("%d%lld",&n,&k);
int mx = ;
for(int i=;i<=n;i++) scanf("%d",&a[i]),mx = max(mx, a[i]);
int l=,r=mx,ans=;
// cout<<ask(2)<<endl;//return 0;
while(l<=r) {
int mid = (l+r)>>;
if(ask(mid)>=k) l=mid+,ans=mid;
else r=mid-;
}
printf("%d\n",ans);
}

51 NOD 1685 第K大区间2 二分+BIT的更多相关文章

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

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

  2. 51nod 第K大区间2(二分+树状数组)

    题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...

  3. 【题解】51nod 1685第K大区间2

    二分答案+++++++(。・ω・。) 感觉这个思路好像挺常用的:求第\(K\) 大 --> 二分第 \(K\) 大的值 --> 检验当前二分的值排名是第几.前提:排名与数值大小成单调性变化 ...

  4. 51nod 1685 第K大区间2

    定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值[1]:3[2]:1[ ...

  5. 51 nod 1105 第K大的数

    1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...

  6. 51nod 1686 第K大区间2

    1685 第K大区间2 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百科 Input 第一行两个数n和k(1<=n ...

  7. 1686 第K大区间

    1686 第K大区间 时间限制:1 秒 空间限制:131072 KB   定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百 ...

  8. 51nod-1686 第K大区间(二分+尺取法)

    题目链接: 第K大区间 基准时间限制:1 秒 空间限制:131072 KB    定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数 ...

  9. 51 nod 1456 小K的技术(强连通 + 并查集)

    1456 小K的技术 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   苏塞克王国是世界上创新技术的领先国家,在王国中有n个城市 ...

随机推荐

  1. Homebrew安装

    1. 安装Command Line Tools 终端输入 xcode-select --install 回车,若下载慢,可搜索Command line Tools的pkg文件,自行安装. 或者直接安装 ...

  2. linux基本命令(4)-8.Ubuntu-jdk+tomcat+eclipse软件包安装

    第一步 安装jdk su - root 切换成root用户 sudo -i 不需要密码直接切换成root 1.进入usr目录 cd /usr 2.在usr目录下建立java安装目录 mkdir jav ...

  3. MongoDB的快速手动安装

    上一篇文章<MongoDB.WebIDE:升级版的Mongodb管理工具>漏了点东西:就是关于MongoDB主从库的安装配置和启动.网上关于MongoDB的安装有大量的文章供大家学习.我这 ...

  4. thinkphp-2

    php的跨文件变量? global $g是一个脚本文件中, 函数外部的变量在函数中要使用时的 全局变量 $_GET等是所谓的"超全局变量", 但仍然是只能在一个脚本的范围内使用 要 ...

  5. C++小思

    Bjarne那稀疏的棕褐色头发, 有点红的眼睛, 这个可爱的好老头, 感觉他更应该是一个哲学家, 因为他用编程的语言C++ 揭示了我们这个纷繁复杂世界的本质: 对象. 对的, 世界是由对象组成的, 并 ...

  6. 唐巧的iOS技术博客选摘

    1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/   2. 使用cr ...

  7. Twelfth scrum meeting 2015/11/9

    第一阶段的开发即将结束,工程代码已经集合完毕,计划在2015年11月10日发布第一阶段的成果,本次会议主要商量下一阶段需要完成的工作以及页面修改,还有测试人员的bug整理. 会议记录: 第一项:界面修 ...

  8. iphone数据存储之-- Core Data的使用(一)

    http://www.cnblogs.com/xiaodao/archive/2012/10/08/2715477.html 一.概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终 ...

  9. Kalendar server Beijing Tiandiyuandian Technology Limited 果然是木马

    我的Windows 7 系统,在开始菜单里面输入msconfig ,回车打开系统配置,隐藏所有Microsoft的进程,在服务和启动项里面都有 Kalendar server   Beijing Ti ...

  10. Tomcat ClassLoader机制介绍

    本文旨在介绍JVM的类加载机制:同时分析Tomcat不能采用默认的加载机制的原因,并对其加载机制做了介绍. 1.JVM中的类加载机制 在Java2之后的版本中,类的加载采用的是一种称为双亲委派的代理模 ...