[51nod1685]第k大区间
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大区间的更多相关文章
- 51nod-1686 第K大区间(二分+尺取法)
题目链接: 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数 ...
- 51nod 第K大区间2(二分+树状数组)
题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...
- 51nod 1686 第k大区间
1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...
- 1686 第K大区间(尺取+二分)
1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...
- 51nod 1686 第K大区间2
1685 第K大区间2 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百科 Input 第一行两个数n和k(1<=n ...
- 51NOD 1686 第K大区间 二分
第k大区间 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数n和k(1<=n<=100000,k<=n* ...
- 51Nod1686 第K大区间 和 NOI2016 区间
谈一下尺取法的经典题. 第K大区间 定义一个区间的值为其众数出现的次数. 现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数:区间里出现次数最多的数字,例如:1 1 2 2 2,区间[1 ...
- 1686 第K大区间
1686 第K大区间 时间限制:1 秒 空间限制:131072 KB 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百 ...
- 51 NOD 1685 第K大区间2 二分+BIT
题目描述: 定义一个长度为奇数的区间的值为其所包含的的元素的中位数. 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值 [1]:3 [2]:1 ...
随机推荐
- Js多国时间动态更新
Js多国时间动态更新 点击下载
- cpu负载和利用率
理解Linux系统负荷 linux里的CPU负载
- EntityFramework 启用迁移 Enable-Migrations 报异常 "No context type was found in the assembly"
转自:http://www.cnblogs.com/stevenhqq/archive/2013/04/18/3028350.html 以前做项目的时候,没有采用分类库的形式,所以迁移一致非常顺利,没 ...
- TF400916错误修复办法
在使用TFS作为研发过程管理工具的时候,如果调整了工作项的状态信息,可能会出现下面的错误: 要解决此问题非常简单: 1.找一台安装了VS2015程序的环境.因为我们使用的是TFS2015,所以需要对应 ...
- Web Worker 是什么鬼?
前言 前端工程师们一定有过这样的体验,当一个页面加载了大量的 js 文件时,用户界面可能会短暂地"冻结".这很好理解,因为 js 是单线程的语言.我们再走的极端点,一段 js 中出 ...
- rotate 3d基础
基础 看了岑安大大的教程学习了3d基础,之前写了篇总结,觉得写的太散废话太多,重写一篇. 本文需要实现的效果如下:3d球 岑安的两篇教程写的很棒,但我感觉改变下顺序或许会更好理解. 我们把画布(此文所 ...
- 自己存档:table 的css
border:0;margin:0;border-collapse:collapse;border-spacing:0;
- EditPlus怎样自动换行
如果只是使用快捷键Ctrl+Shift+W或者使用文档→自动换行,的话,关闭软件之后再次打开时就会重新出现不能自动换行的问题. 中文版的是:文档→固定值设置(文档 菜单的最后一个),会打开一个“工具→ ...
- The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path。
项目上右键-->Build Path-->Configuration Build Path -->Add Library -->Server Runtime 选择tomcat
- 给菜单加个优雅的unselect事件
先上图,说场景 假设默认选中的是item1,我现在选中item3了,有时候需要对item1做一些别的处理.常见的做法是,切换选中状态前找到当前选中(item1),或者每次选中后选中的项记录在中间变量. ...