http://www.51nod.com/contest/problem.html#!problemId=1685

这是这次BSG白山极客挑战赛的E题。

这题可以二分答案t。

关键在于,对于一个t,如何判断它是否能成为第k大。

将序列中大于t的置为1,小于t的置为-1,等于t的置为0。那么区间中位数大于t的和就大于0,小于t的就小于0。于是就是判断区间和大于0的个数是否小于等于k。

维护前缀和sum(i),然后统计之前sum(j)小于sum(i)的有多少个,就是以i为右值的区间和大于0的个数。于是就可以用树状数组维护了。

由于是奇数长度区间,所以树状数组需要维护奇偶长度的前缀和个数。需要特判sum(i) > 0的情况。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <string>
#define LL long long using namespace std; //线段树
//区间每点增值,求区间和
const int maxN = ; LL d[][maxN*]; int lowbit(int x)
{
return x&(-x);
} void add(int t, int id,int pls)
{
while(id <= maxN<<)//id最大是maxN
{
d[t][id] += pls;
id += lowbit(id);
}
} LL sum(int t, int to)
{
LL s = ;
while(to > )
{
s = s + d[t][to];
to -= lowbit(to);
}
return s;
} LL query(int t, int from, int to)
{
return sum(t, to) - sum(t, from-);
} int n, a[maxN], b[maxN];
LL k; LL judge(int t)
{
for (int i = ; i < n; ++i)
{
if (a[i] > t) b[i] = ;
else if (a[i] == t) b[i] = ;
else b[i] = -;
}
memset(d, , sizeof(d));
int sum = ;
LL ans = ;
for (int i = ; i < n; ++i)
{
sum += b[i];
ans += query(!(i%), -n, +sum-);
if (i% == && sum > ) ans++;
add(i%, +sum, );
}
return ans;
} void work()
{
int lt, rt, mid;
lt = rt = a[];
for (int i = ; i < n; ++i)
{
lt = min(lt, a[i]);
rt = max(rt, a[i]);
}
while ((LL)lt+ < rt)
{
mid = ((LL)lt+rt)>>;
if (judge(mid) > k-) lt = mid;
else rt = mid;
}
if (judge(lt) <= k-) printf("%d\n", lt);
else printf("%d\n", rt);
} int main()
{
//freopen("test.in", "r", stdin);
while (scanf("%d", &n) != EOF)
{
cin >> k;
for (int i = ; i < n; ++i) scanf("%d", &a[i]);
work();
}
return ;
}

ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)的更多相关文章

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

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

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

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

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

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

  4. 51nod 1685 第K大区间2

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

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

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

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

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

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

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

  8. 51nod 1686 第k大区间

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

  9. 51nod 1686 第K大区间2

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

随机推荐

  1. Centos6.5安装python2.7与pip

    安装Python2.7 安装环境 [root@localhost1 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@local ...

  2. 对拷 使用scp命令在两台linux上对拷文件或者文件夹

    以前一直是在服务器上tar打包压缩,下载到本地电脑上,再上传到另外一台服务器上,再解压. 其实使用scp命令就可以直接对拷文件或者文件夹了. scp就是secure copy,是用来进行远程文件拷贝的 ...

  3. JVM 深入浅出

    jvm 相信大家都有认知 在面试中也是经常遇见的希望接下来的这篇文章可以对你们带来帮助 java 的好处 : java这门语言之所以受广大的码农所喜爱是因为它不像C语言需要程序员自己手动分配内存空间 ...

  4. 2017版:KVM 性能优化之内存优化

    我们说完CPU方面的优化,接着我们继续第二块内容,也就是内存方面的优化.内存方面有以下四个方向去着手: EPT 技术 大页和透明大页 KSM 技术 内存限制 1. EPT技术 EPT也就是扩展页表,这 ...

  5. 编写程序时候莫名出现<property name="dialect">org.hibernate.dialect.FirebirdDialect</property>

    把<propertyname="dialect">org.hibernate.dialect.FirebirdDialect</property> 语句去掉 ...

  6. css属性(冷用法)

    1.pointer-events:none 元素永远不会成为鼠标事件的target. 2.not-allowed  禁止 3.-webkit-appearance: none; appearance ...

  7. python学习笔记(excel中处理日期格式)

    涉及到处理excel文件中日期格式数据 这里自己整理下 两种方法 代码如下: @classmethod def get_time(cls, table, nrows): testtime = [] f ...

  8. StringUtils在commons-lang3和commons-lang中的区别【转】

    http://blog.csdn.net/eden_m516/article/details/75042439 最近经常需要对String做一些判断和处理,于是就用到了Apache提供的StringU ...

  9. Django进阶Admin篇 - admin基本配置

    django admin 是django自带的一个后台app,提供了后台的管理功能. 基础知识点: 一.认识ModelAdmin 管理界面的定制类,如需扩展特定的model界面,需要从该类继承 二.注 ...

  10. Win7 SP1 下安装 VS2015 Update 3

    首先Win7必须是SP1,然后要求安装IE11,安装IE11前需要安装6个先决补丁,成功安装IE11后建议安装3个可选补丁.然后导入3个根证书(COMODO RSA Certification Aut ...