ARC 101 D - Median of Medians
这种题只能二分答案把qwwq,直接做根本做不了啊。。。
首先你需要知道如何通过 一个区间<=x的数有多少个 来判断x和这个区间中位数的关系。
很显然当数有至少 [L/2]+1 个(L是区间内数的个数)时,x>=该区间的中位数。
你肯定觉得这多简单啊?有啥子用?
第一,它可以转化成,区间内<=x的数比剩下的数多的时候,x>=该区间的中位数,于是就可以做二分里面套的部分。
具体的来说,就是我们二分到一个x的时候,希望知道有多少个区间的中位数<=x。
这个时候只需要把<=x的数设置成1,其他的设置成-1,然后算一算有多少区间的数的和是正数,这显然就是一个离散化+树状数组的傻逼问题。
第二,它还可以用来作最外层的二分判断,调整二分的上下界。
这个比较好想,我就不说了2333。
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int N=1e5+5; int n,m,f[N],ans,a[N],mid,b[N],c[N],ky;
ll num; inline void update(int x,int y){ for(;x<=ky;x+=x&-x) f[x]+=y;}
inline int query(int x){ int an=0; for(;x;x-=x&-x) an+=f[x]; return an;} inline ll calc(){
ll an=0;
b[0]=0,memset(f,0,sizeof(f));
for(int i=1;i<=n;i++) b[i]=b[i-1]+(a[i]<=mid?1:-1),c[i]=b[i];
c[ky=n+1]=0,sort(c+1,c+ky+1),ky=unique(c+1,c+ky+1)-c-1;
for(int i=0;i<=n;i++) b[i]=lower_bound(c+1,c+ky+1,b[i])-c; update(b[0],1);
for(int i=1;i<=n;i++) an+=(ll)query(b[i]-1),update(b[i],1); return an;
} inline void solve(){
int L=1,R=1e9;
while(L<=R){
mid=L+R>>1;
if(calc()>=num) ans=mid,R=mid-1;
else L=mid+1;
}
} int main(){
scanf("%d",&n),num=n*(ll)(n+1)>>1,num=(num>>1)+1;
for(int i=1;i<=n;i++) scanf("%d",a+i); solve(); printf("%d\n",ans);
return 0;
}
ARC 101 D - Median of Medians的更多相关文章
- AtCoder Regular Contest 101 D - Median of Medians
二分答案 然后前缀和+树状数组来判断这个答案是否大于等于数 如果我们对于一个查询,如果小于这个数令为1,大于这个数领为-1 将所有前缀和放在树状数组中,就可以查询所有sum_{l} < sum_ ...
- AtCoder - 4351 Median of Medians(二分+线段树求顺序对)
D - Median of Medians Time limit : 2sec / Memory limit : 1024MB Score : 700 pointsProblem Statement ...
- AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...
- 【AtCoder】 ARC 101
link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...
- [AtCoder ARC101D/ABC107D] Median of Medians
题目链接 题意:给n个数,求出所有子区间的中位数,组成另外一个序列,求出它的中位数 这里的中位数的定义是:将当前区间排序后,设区间长度为m,则中位数为第m/2+1个数 做法:二分+前缀和+树状数组维护 ...
- ARC 101 C - Candles
题面在这里! 显然直接枚举左端点(右端点)就OK啦. #include<cstdio> #include<cstdlib> #include<algorithm> ...
- AtCoder4351 Median of Medians 二分, 树状数组
题目大意 定义一个从小到大的数列的中位数为第 $ \frac{n}{2}+1 $ 项.求一个序列的所有连续子序列的中位数的中位数. $ (n \leqslant 100000)$ 问题分析 由于\(n ...
- [ARC101B]Median of Medians
题目 点这里看题目. 分析 看到中位数,当然会想到二分答案. 考虑检查答案.自然,我们需要找出中位数小于二分值\(k\)的区间的个数.考虑构造一个\(b\): \[b_i=(-1)^{[a ...
- CodeForces 1098E. Fedya the Potter
题目简述:给定长度为$n \leq 5\times 10^4$的序列$a_1, a_2, \dots, a_n \leq 10^5$.将$\gcd(a_l, a_{l+1}, \dots, a_r) ...
随机推荐
- Dream------Hadoop--FSDataInputStream和FSDataOutputStream
一.FSDataInputStream FileSystem中的open()方法实际上返回的是一个FSDataInputStream,而不是标准的java.io类.这个类是java.io.Dat ...
- jQuery动态给下拉列表添加一个选项(创建DOM对象)
使用的函数:
- angular select ng-change实时获取value
<select ng-model="vm.selectVal" ng-options="o.id as o.title for o in vm.optionsDat ...
- 【Python项目】爬取新浪微博签到页
基于微博签到页的微博爬虫 项目链接:https://github.com/RealIvyWong/WeiboCrawler/tree/master/WeiboLocationCrawler 1 实现功 ...
- Cloud Lab: 泰晓实验云台【转】
转自:http://tinylab.org/cloud-lab/ 可快速构建的计算机课程在线实验平台 由 Wu Zhangjin 创建于 2017/10/06 评论 打赏 项目描述 泰晓实验云台 项目 ...
- 2018ICPC南京网络赛
2018ICPC南京网络赛 A. An Olympian Math Problem 题目描述:求\(\sum_{i=1}^{n} i\times i! \%n\) solution \[(n-1) \ ...
- No.15 selenium for python JavaScript
JS处理滚动条 一.上下滚动 1.滚动条回到顶部: js="var q=document.documentElement.scrollTop=10000" driver.execu ...
- Python模块Pygame安装
一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...
- (转载)使用SQL-Server创建一个银行数据管理系统Ⅰ
首先,要创建一个完整的数据管理系统,不是一蹴而就的,一定要要一步一步的来,不断完善,最终方能达到自己想要的结果,所以我在这里也是一点一点分步来做的. 创建数据库,数据库属性在这里用的是默认(不推荐使用 ...
- Web前端开发最佳实践(10):JavaScript代码不好读,不好维护?你需要改变写代码的习惯
前言 这篇文章本应该在上一篇文章:使用更严格的JavaScript编码方式,提高代码质量之前发布,但当时觉得这篇文章太过基础,也就作罢.后来咨询了一些初级的开发者,他们觉得有必要把这篇文章也放上来.尽 ...