Description

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

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

Input

第一行两个数$n$和$k$.第二行$n$个数$a_i$.

Output

一个数表示答案.

Sample Input

4 3
3 1 2 4

Sample Output

2

HINT

$1\;\leq\;n\;\leq\;10^5,k\;\leq\;$奇数区间的数量,$0\;\leq\;a_i<2^{31}$

Solution

二分答案$ans$,统计长度为奇数的区间的值$\;\geq\;ans$的区间数.

把所有$a_i\;\geq\;ans$的位置标为$1$,所有$a_i<ans$的位置标为$0$,求出前缀和$sum[\;]$.

则值$\;\geq\;ans$的区间$[j,i]$满足条件$sum_i-sum_{j-1}>\frac{i-j+1}{2}$($i,j$同号).

移项得,$2\;\times\;sum_i-i>2\;\times\;sum_{j-1}-(j-1)$.

即用树状数组维护顺序对即可.

#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100005
using namespace std;
typedef long long ll;
ll a[N],b[N],k;
int s[][N*],sum[N],n,m,l,r,mid;
inline int lowbit(int x){
return x&(-x);
}
inline int ask(int k,int j){
int ret=;
for(int i=k;i;i-=lowbit(i))
ret+=s[j][i];
return ret;
}
inline void add(int k,int j){
for(int i=k;i<=m;i+=lowbit(i))
++s[j][i];
}
inline bool chk(ll x){
ll cnt=0LL;
memset(s,,sizeof(s));
for(int i=;i<=n;++i)
if(a[i]>=x) sum[i]=sum[i-]+;
else sum[i]=sum[i-];
for(int i=,tmp;i<=n;++i){
tmp=(sum[i]<<)-i+n;
cnt+=(ll)(ask(tmp,i&^));
add(tmp,i&);
if((i&)&&(sum[i]<<)-i>=0LL) ++cnt;
}
return cnt>=k;
}
inline void init(){
scanf("%d%lld",&n,&k);
for(int i=;i<=n;++i){
scanf("%lld",&a[i]);
b[i]=a[i];
}
l=;r=n;m=n*;
sort(b+,b++n);
while(l<r){
mid=(l+r+)>>;
if(chk(b[mid])) l=mid;
else r=mid-;
}
printf("%lld\n",b[l]);
}
int main(){
freopen("kth.in","r",stdin);
freopen("kth.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return ;
}

[51nod1685]第k大区间的更多相关文章

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

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

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

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

  3. 51nod 1686 第k大区间

    1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...

  4. 1686 第K大区间(尺取+二分)

    1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...

  5. 51nod 1686 第K大区间2

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

  6. 51NOD 1686 第K大区间 二分

    第k大区间   定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input   第一行两个数n和k(1<=n<=100000,k<=n* ...

  7. 51Nod1686 第K大区间 和 NOI2016 区间

    谈一下尺取法的经典题. 第K大区间 定义一个区间的值为其众数出现的次数. 现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数:区间里出现次数最多的数字,例如:1 1 2 2 2,区间[1 ...

  8. 1686 第K大区间

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

  9. 51 NOD 1685 第K大区间2 二分+BIT

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

随机推荐

  1. Js多国时间动态更新

    Js多国时间动态更新 点击下载

  2. cpu负载和利用率

    理解Linux系统负荷 linux里的CPU负载

  3. EntityFramework 启用迁移 Enable-Migrations 报异常 "No context type was found in the assembly"

    转自:http://www.cnblogs.com/stevenhqq/archive/2013/04/18/3028350.html 以前做项目的时候,没有采用分类库的形式,所以迁移一致非常顺利,没 ...

  4. TF400916错误修复办法

    在使用TFS作为研发过程管理工具的时候,如果调整了工作项的状态信息,可能会出现下面的错误: 要解决此问题非常简单: 1.找一台安装了VS2015程序的环境.因为我们使用的是TFS2015,所以需要对应 ...

  5. Web Worker 是什么鬼?

    前言 前端工程师们一定有过这样的体验,当一个页面加载了大量的 js 文件时,用户界面可能会短暂地"冻结".这很好理解,因为 js 是单线程的语言.我们再走的极端点,一段 js 中出 ...

  6. rotate 3d基础

    基础 看了岑安大大的教程学习了3d基础,之前写了篇总结,觉得写的太散废话太多,重写一篇. 本文需要实现的效果如下:3d球 岑安的两篇教程写的很棒,但我感觉改变下顺序或许会更好理解. 我们把画布(此文所 ...

  7. 自己存档:table 的css

    border:0;margin:0;border-collapse:collapse;border-spacing:0;

  8. EditPlus怎样自动换行

    如果只是使用快捷键Ctrl+Shift+W或者使用文档→自动换行,的话,关闭软件之后再次打开时就会重新出现不能自动换行的问题. 中文版的是:文档→固定值设置(文档 菜单的最后一个),会打开一个“工具→ ...

  9. The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path。

    项目上右键-->Build Path-->Configuration Build Path -->Add Library -->Server Runtime 选择tomcat

  10. 给菜单加个优雅的unselect事件

    先上图,说场景 假设默认选中的是item1,我现在选中item3了,有时候需要对item1做一些别的处理.常见的做法是,切换选中状态前找到当前选中(item1),或者每次选中后选中的项记录在中间变量. ...