ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)
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(二分 && 树状数组 && 中位数)的更多相关文章
- 51nod 第K大区间2(二分+树状数组)
题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【题解】51nod 1685第K大区间2
二分答案+++++++(。・ω・。) 感觉这个思路好像挺常用的:求第\(K\) 大 --> 二分第 \(K\) 大的值 --> 检验当前二分的值排名是第几.前提:排名与数值大小成单调性变化 ...
- 51nod 1685 第K大区间2
定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值[1]:3[2]:1[ ...
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- 51 NOD 1685 第K大区间2 二分+BIT
题目描述: 定义一个长度为奇数的区间的值为其所包含的的元素的中位数. 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值 [1]:3 [2]:1 ...
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 418 Solved: 235 [ Submit][ ...
- 51nod 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 ...
随机推荐
- Win32 API编程:显示系统进程列表
#include <windows.h> #include <tlhelp32.h> // 声明快照函数的头文件 #include "tchar.h" #i ...
- mysql配置文件生效顺序
安装完数据库 除了将my.cnf放在/etc/下放在其他地方也是可以的 cp /usr/share/mysql/my-default.cnf /etc/my.cnf 今天就看一下这些my.cnf是怎么 ...
- VMware Workstation 12 增加磁盘容量 Windows Server 2012 系统
1.安装虚拟机后,检查C盘容量大小,发现C盘现在的空间是59.9GB,如下图: 2.使用window+R键,出现运行窗口,输入‘cmd’——>‘cd C:\Program Files (x86) ...
- C++中map的用法
map的特性是,所有元素都会根据元素的减值自动被排序.map的所有元素都是pair,同时拥有实值(value)和键值(key).pair的第一个元素会被视为键值,第二个元素会被视为实值.map不允许两 ...
- Android开发-Android Studio安装
开发平台:Windows 7 旗舰版,SP1 开发工具:Android Studio1.2正式版 1.打开http://www.androiddevtools.cn/ ,找到Android Studi ...
- CodeChef FORESTGA 二分
Forest Gathering Problem code: FORESTGA Tweet ALL SUBMISSIONS All submissions for this problem ...
- mybatis引入dtd约束
window->preferences,然后寻找xml catalog,点击add如下所示 将dtd网址复制到key中 key type选择uri,选择dtd的下载路径.
- day5-python中的序列化与反序列化-json&pickle
一.概述 玩过稍微大型一点的游戏的朋友都知道,很多游戏的存档功能使得我们可以方便地迅速进入上一次退出的状态(包括装备.等级.经验值等在内的一切运行时数据),那么在程序开发中也存在这样的需求:比较简单的 ...
- 依赖注入和Guice理解
理解依赖注入,这篇文章写得非常好,结合spring的依赖注入分析的. http://blog.csdn.net/taijianyu/article/details/2338311/ 大体的意思是: 有 ...
- HDU 1561 The more, The Better(树形DP+01背包)
The more, The Better Time Limit : 6000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other ...