【题解】51nod 1685第K大区间2
二分答案+++++++(。・ω・。) 感觉这个思路好像挺常用的:求第\(K\) 大 --> 二分第 \(K\) 大的值 --> 检验当前二分的值排名是第几。前提:排名与数值大小成单调性变化。于是对于这题我们也不例外,二分一下最后中位数的值是多少,把数组中的值 \(> K\) 的变成 \(1\),\(< K\) 的变成 \(-1\), \(= K\) 的为 \(0\)。那么,一个中位数为 \(K\) 的区间区间和为 \(0\), 一个中位数\(< K\) 的区间和 \(< 0\), \(> K\) 则 \(> 0\)。
于是求区间中位数 \(> K\) 和 \(=K\) 的区间就转化为了求满足条件的区间值的区间。这个只需要用树状数组维护一下就好啦。由于有奇数的规定,我们开两个树状数组分别代表偶数下标和奇数下标,以保证求得的区间长度为奇数。以及因为有负数,所以将数组整体向后平移即可。
#include<bits/stdc++.h>
using namespace std;
#define maxn 350000
#define INF INT_MAX
#define lowbit(i) (i & (-i))
int n, K, ans, a[maxn], A[maxn], sum[maxn];
int C[][maxn], b[maxn], D = 1e5; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Update(int x, int opt)
{
for(int i = x; i < maxn; i += lowbit(i))
C[opt][i] += ;
} int Query(int x, int opt)
{
int ret = ;
for(int i = x; i; i -= lowbit(i))
ret += C[opt][i];
return ret;
} int Check(int mid)
{
memset(C, , sizeof(C));
int ans1 = , ans2 = ; Update(D, );
for(int i = ; i <= n; i ++)
{
if(a[i] < mid) A[i] = -;
else if(a[i] > mid) A[i] = ;
else A[i] = ;
sum[i] = sum[i - ] + A[i];
Update(sum[i] + D, i % );
ans1 += Query(sum[i] + D, (i % ) ^ ) - Query(sum[i] + D - , (i % ) ^ );
ans2 += Query(sum[i] + D - , (i % ) ^ );
}
if(K > ans1 + ans2) return ;
else if(K < ans2) return ;
else return ;
} int main()
{
n = read(), K = read();
for(int i = ; i <= n; i ++) a[i] = b[i] = read();
sort(b + , b + + n);
int l = , r = n;
while(l <= r)
{
int mid = (l + r) >> ;
int k = Check(b[mid]);
if(k == ) r = mid - ;
else if(k == ) l = mid + ;
else { ans = b[mid]; break; }
}
printf("%d\n", ans);
return ;
}
【题解】51nod 1685第K大区间2的更多相关文章
- ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)
http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...
- 51nod 1685 第K大区间2
定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值[1]:3[2]:1[ ...
- 51nod 1686 第K大区间2
1685 第K大区间2 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百科 Input 第一行两个数n和k(1<=n ...
- 51nod 1686 第k大区间
1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...
- 51NOD 1686 第K大区间 二分
第k大区间 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数n和k(1<=n<=100000,k<=n* ...
- 【题解】51nod 1686第K大区间
成功的秘诀,在于克服自己看题解的冲动……[笑哭].自己A掉这题还是灰常开心的~ 以及爱死 two - pointer ! two - pointer 大法是真的好哇……这个题目有上一题的经验:求第\( ...
- 51 NOD 1685 第K大区间2 二分+BIT
题目描述: 定义一个长度为奇数的区间的值为其所包含的的元素的中位数. 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值 [1]:3 [2]:1 ...
- 51nod 1686 第K大区间 二分瞎搞
题目: 定义一个区间的值为其众数出现的次数. 现给出n个数,求将所有区间的值排序后,第K大的值为多少. 题解: 答案明显单调,我们考虑二分答案. 转化为判定问题后我们需要观察到一个性质: 如果一个区间 ...
- 51nod 1686 第K大区间【离散化+二分】
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 定义一个区间的值为其众数出现的次数. 现给出n ...
随机推荐
- 图片文件转换成Base64编码实现ajax提交图片
//上传头像图片 function uploadHead(imgPath) { console.log("imgPath = " + imgPath); var image = n ...
- 「暑期训练」「基础DP」免费馅饼(HDU-1176)
题意与分析 中文题就不讲题意了.我是真的菜,菜出声. 不妨思考一下,限制了我们决策的有哪些因素?一,所在的位置:二,所在的时间.还有吗?没有了,所以设dp[i][j]" role=" ...
- Zookeeper与Eureka的区别
Zookeeper与Eureka的区别 想要了解Zk与eureka的区别首先要知道CAP定理 CAP定理 Mysql强一致性(数据唯一出处),设计数据库设计的三范式 (表必须有主键:表不能有重复的列: ...
- 【转】Buff机制及其实际运用
转自 http://bbs.gameres.com/forum.php?mod=viewthread&tid=215027 首先我想说的是,这是一套机制,并不是单独的一个系统,所谓机制就是一种 ...
- 关于GitHub推送时发生Permission denied (publickey)的问题
今天在学习廖雪峰老师官网的git教程“添加远程库”时发现总是推送失败,下边提示“Permission denied (publickey) 这个问题” 传送门:https://www.liaoxuef ...
- dice2win早期版本
原理; https://medium.com/dapppub/fairdicedesign-315a4e253ad6 早期版本地址: https://etherscan.io/address/0xD1 ...
- HADOOP docker(二):HDFS 高可用原理
1.环境简述2.QJM HA简述2.1为什么要做HDFS HA?2.2 HDFS HA的方式2.2 HSFS HA的结构2.3 机器要求3.部署HDFS HA3.1 详细配置3.2 部署HDF ...
- 【IdentityServer4文档】- 整体情况
整体概况 大多数现代应用程序看起来或多或少像这样: 最常见的交互是: 浏览器与 Web 应用程序进行通信 Web 应用程序与 Web API 进行通信(有时是Web应用程序自己发起,有时代表用户发起) ...
- iOS- <项目笔记>项目配置常见文件
项目常见文件 1.main.m * 里面有一个程序的入口:main函数 2.Prefix.pch文件 * pch文件中的内容能被项目中的其他任何文件共享\包含\访问 * 如果定义的内容只用在OC环境中 ...
- TCP系列20—重传—10、早期重传(ER)
一.介绍 在前面介绍thin stream时候我们介绍过有两种场景下可能不会产生足够的dup ACK来触发快速重传,一种是游戏类响应交互式tcp传输,另外一种是传输受到拥塞控制的限制,只能发送少量TC ...