[AtCoder ARC101D/ABC107D] Median of Medians
题意:给n个数,求出所有子区间的中位数,组成另外一个序列,求出它的中位数
这里的中位数的定义是:将当前区间排序后,设区间长度为m,则中位数为第m/2+1个数
做法:二分+前缀和+树状数组维护
极其妙的一个做法。
效率$O(nlognlogA)$这里的A指的是原序列中的最大值
二分一下最后的中位数,然后将原序列中大于当前二分出来的值标为1,小于的标为-1,处理出前缀和。
那么只要一段区间的和大于0,那么这段区间的中位数就一定大于等于当前二分出来的值。
所以问题就变成了,求出当前这个序列的顺序对个数(两个数是顺序对,当且仅当$ai<aj,i<j$),用类似于逆序对的方法求
那么做法就很显然了,用树状数组维护一下,单次check的效率就是$O(nlogn)$
要注意的一个点是,这里的树状数组不能有负数,所以得加个1e5强制转正(因为是下标)
至于check的$true$和$false$,如果最后算出来的顺序对个数大于$n*(n-1)/4$那么就是$true$(一共有$n*(n-1)/2$个区间,然后因为我们要求的中位数在中间,所以要再除一次2)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define inf 1<<30
#define il inline
#define in1(a) read(a)
#define in2(a,b) in1(a),in1(b)
#define in3(a,b,c) in2(a,b),in1(c)
#define in4(a,b,c,d) in2(a,b),in2(c,d)
il void readl(ll &x){
x=;ll f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-f;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
x*=f;
}
il void read(int &x){
x=;int f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-f;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
x*=f;
}
using namespace std;
/*===================Header Template=====================*/
#define N 100010
#define lowbit(x) x&-x
int c[N*];
int n,a[N],s[N*];
void add(int x){
for(int i=x;i<=*N;i+=lowbit(i))c[i]++;
}
ll query(int x){
ll sum=;
for(int i=x;i>;i-=lowbit(i))sum+=c[i];
return sum;
}
bool check(int x){
for(int i=;i<=*N;i++)c[i]=;
s[]=;
for(int i=;i<=n;i++)
s[i]=s[i-]+(a[i]>=x?:-);
ll sum=;
for(int i=;i<=n;i++){
sum+=query(s[i]+N);
add(s[i]+N);
}
return sum>=1ll*n*(n+)/;
}
int main(){
in1(n);
int l=,r=;
for(int i=;i<=n;i++){
in1(a[i]);
r=max(r,a[i]);
}
int ans=;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))l=mid+;
else r=mid-;
}
printf("%d\n",r);
}
[AtCoder ARC101D/ABC107D] Median of Medians的更多相关文章
- 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 Regular Contest 101 D - Median of Medians
二分答案 然后前缀和+树状数组来判断这个答案是否大于等于数 如果我们对于一个查询,如果小于这个数令为1,大于这个数领为-1 将所有前缀和放在树状数组中,就可以查询所有sum_{l} < sum_ ...
- ARC 101 D - Median of Medians
题面在这里! 这种题只能二分答案把qwwq,直接做根本做不了啊... 首先你需要知道如何通过 一个区间<=x的数有多少个 来判断x和这个区间中位数的关系. 很显然当数有至少 [L/2]+1 个( ...
- AtCoder4351 Median of Medians 二分, 树状数组
题目大意 定义一个从小到大的数列的中位数为第 $ \frac{n}{2}+1 $ 项.求一个序列的所有连续子序列的中位数的中位数. $ (n \leqslant 100000)$ 问题分析 由于\(n ...
- [ARC101B]Median of Medians
题目 点这里看题目. 分析 看到中位数,当然会想到二分答案. 考虑检查答案.自然,我们需要找出中位数小于二分值\(k\)的区间的个数.考虑构造一个\(b\): \[b_i=(-1)^{[a ...
- 【AtCoder】【DP】【思维】Prefix Median(AGC012)
模的是这位神犇的代码:Atcoder AGC012F : Prefix Median 题意: 在动态中位数那道题上做了一些改动.给你一个序列a,可以将a重新任意排序,然后对于a序列构造出b序列. 假设 ...
- 【AtCoder】ARC101题解
C - Candles 题解 点燃的一定是连续的一段,枚举左端点即可 代码 #include <bits/stdc++.h> #define enter putchar('\n') #de ...
- 【arc101】比赛记录
这场还好切出了D,rt应该能涨,然而这场的题有点毒瘤,700分的D没多少人切,更别说EF了.(暴打出题人)既然这样,干脆就水一篇博客,做个简单的比赛记录. C - Candles 这题是一道一眼题,花 ...
随机推荐
- python修饰器各种实用方法
This page is meant to be a central repository of decorator code pieces, whether useful or not <wi ...
- [LeetCode] 122. Best Time to Buy and Sell Stock II_Easy tag: Dynamic Programming
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- [lr] 基本色调调整和色调曲线
基本色调调整 • 曝光度调整 ▶ 控制区域 在Lightroom中,软件提示我们曝光控制的是如图中间调的区域.我们把鼠标移动到曝光工具条上,软件会提示我们这个区域: ▶ 实际效果 ▪ 增加曝光值 增加 ...
- OpenCV Mat数据类型及位数总结(转载)
OpenCV Mat数据类型及位数总结(转载) 前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量, ...
- 转载人家写的CURSOR
转自:http://blog.csdn.net/rdarda/article/details/7881648 1.游标的作用及属性 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操 ...
- PAT乙级 1024. 科学计数法 (20)(未通过全部测试,得分18)
1024. 科学计数法 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 科学计数法是科学家用来表示很 ...
- ZOJ 3949 Edge to the Root
题意: 在一棵树中,可以从根节点往其他节点加一条边,使得根节点到其他所有节点的距离和最小,输出最小的距离和. 思路: 我们考虑在加的一条边为$1 \to v$,那么在树上从$1 \to v$的路径上, ...
- MySQL从删库到跑路_高级(六)——索引
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.索引简介 1.索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构. 在MySQL中,索引属于存储 ...
- python 循环队列的实现
最近在做一个东西的时候发现需要用到循环队列,实现先进先出(FIFO),不断往里面添加数据,当达到某个限定值时,最先进去的出去,然后再添加.之后需要对队列里面的内容进行一个筛选,作其他处理.首先我想到了 ...
- 基于Axis1.4的webservice接口开发(环境搭建)
基于Axis1.4的webservice接口开发(环境搭建) 一.环境搭建: 1.搜索关键字“Axis1.4”下载Axis1.4相关的jar包. 下载地址:http://download.csdn.n ...