[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 ...
随机推荐
- apt-get update更新源时,出现“Hash Sum mismatch”问题
当使用apt-get update更新源时,出现下面"Hash Sum mismatch"的报错,具体如下:root@localhost:~# apt-get update.... ...
- 開博客了, 因為搞Delphi 開發的關於Delphi學習
開博客了, 因為搞Delphi 開發的關於Delphi學習,之前都是用本地TXT文件保存,發現在本地電腦保存非常不方面,而且只能在一台電腦上保存,不容易查看和修改內容.便於以後的記錄只用,以及經驗交流 ...
- CentOS VMware 下SSH配置方法详解
1.安装SSH[root@sample ~]# yum install ssh2.启动SSH[root@sample ~]# service sshd start3.设置开机运行[root@sampl ...
- hadoop 2.6全分布安装
环境:centos 6.6 + hadoop2.6 虚拟机:(vmware fusion 7.0.0) 虚拟机hostname / IP地址 master / 192.168.187. ...
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
- 模拟MVC-WebForm实现ModelBinding
(一) 前言 用ASP.NET MVC的时候,我们都 ...
- 这些javascript面试题,你做对了几道?
1.---------------------------------------------------- var fun = function(){ this.name = 'peter'; re ...
- HTML5+JS 《五子飞》游戏实现(六)鼠标响应与多重选择
上一章我们提到了如果有多条线上的棋子可以被吃掉,那么游戏需要提示用户,让用户选择吃哪条线上的.另外因为是网页游戏,所以一定要实现鼠标单击棋子可以进行操作. 当鼠标移动棋子上面后,切换鼠标指针为手形,移 ...
- Web Api 2 接口API文档美化
使用用第三方提供的swgger ui 帮助提高 web api 接口列表的阅读性,并且可以在页面中测试服务接口. 运行程序如下: 注意:在IE中必须输入红色部分. 并且可以对方法进行测试. 在开发we ...
- python 2.7 简单模拟登陆网站
举个栗子,首先创建网络会话, 然后就可以用创建的session来访问网页了. session.get(URL) #-*- coding:utf-8 -*- import requests import ...