题目大意

定义一个从小到大的数列的中位数为第 $ \frac{n}{2}+1 $ 项。求一个序列的所有连续子序列的中位数的中位数。 $ (n \leqslant 100000)$

问题分析

由于\(n\)的范围较大,所以不可能把序列构造出来。我们不妨换个角度分析。我们设最后的序列总共有\(N=\frac{n(n-1)}{2}\)项。

若最终答案为\(x\),那么也就是说,有\(\frac{N}{2}+1\)项的中位数不大于\(x\)。如果我们令原序列中小于等于\(x\)的数为\(1\),否则为\(-1\),那么这个又等价于有\(\frac{N}{2}+1\)段子区间和为正。所以我们可以二分答案,求最小的\(x\),使得上述条件成立。

至于如何求和为正的子区间数,我们用前缀和+树状数组即可。\(i\)对答案的贡献就是\(\sum_{j=1}^{i-1}sum[j]<sum[i]\)。

参考程序

#include <bits/stdc++.h>
using namespace std; long long n, a[ 100010 ];
long long Sum[ 100010 ], l, r;
long long Ans;
long long Tree[ 200010 ]; long long Lowbit( long long x ) { return x & -x; } void Add( long long x ) {
while( x <= 200001 ) {
++Tree[ x ];
x += Lowbit( x );
}
return;
} long long Query( long long x ) {
long long ans = 0;
while( x ) {
ans += Tree[ x ];
x -= Lowbit( x );
}
return ans;
} int main() {
scanf( "%lld", &n );
Ans = n * ( n + 1 ) / 4 + 1;
for( long long i = 1; i <= n; ++i ) scanf( "%lld", &a[ i ] );
l = 0; r = 1e9 + 1;
while( l < r ) {
long long mid = l + r >> 1;
for( long long i = 1; i <= n; ++i )
if( a[ i ] > mid ) Sum[ i ] = -1; else Sum[ i ] = 1;
Sum[ 0 ] = 0;
for( long long i = 1; i <= n; ++i ) Sum[ i ] += Sum[ i - 1 ];
for( long long i = 0; i <= n; ++i ) Sum[ i ] += 100001;
memset( Tree, 0, sizeof( Tree ) );
Add( Sum[ 0 ] );
long long Cnt = 0;
for( long long i = 1; i <= n; ++i ) {
Cnt += Query( Sum[ i ] - 1 );
Add( Sum[ i ] );
}
if( Cnt >= Ans ) r = mid; else l = mid + 1;
}
printf( "%lld\n", l );
return 0;
}

AtCoder4351 Median of Medians 二分, 树状数组的更多相关文章

  1. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  2. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

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

  3. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  4. bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...

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

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

  6. zoj-3963 Heap Partition(贪心+二分+树状数组)

    题目链接: Heap Partition Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge A sequence ...

  7. 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组

    题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...

  8. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

  9. [ZJOI2006]书架(二分+树状数组)

    这题90%以上的人做法为裸的平衡树,实际上根本没必要还常数大,最好的方法是二分+树状数组.具体做法是,开3倍内存,初始把中间n位赋值为1.对于每个操作:1&2.删除该位,将其丢在头/尾(开三倍 ...

随机推荐

  1. Idea导入Eclipse的Web项目并部署到Tomcat

    ⒈启动Idea,选择导入项目 选择导入的项目路径后,选择项目类型后一路next即可. ⒉选择File->Project Structure打开项目配置窗口(ctrl + alt + shift ...

  2. java循环队列实现代码

    public class Queue { //队首指针 private int front; //队尾指针 private int rear; //数组 private int[] arr; //数组 ...

  3. 【GDOI】2018题目及题解(未写完)

    我的游记:https://www.cnblogs.com/huangzihaoal/p/11154228.html DAY1 题目 T1 农场 [题目描述] [输入] 第一行,一个整数n. 第二行,n ...

  4. (模拟)关于进制的瞎搞---You Are Given a Decimal String...(Educational Codeforces Round 70 (Rated for Div. 2))

    题目链接:https://codeforc.es/contest/1202/problem/B 题意: 给你一串数,问你插入最少多少数可以使x-y型机器(每次+x或+y的机器,机器每次只取最低位--% ...

  5. 2019年8月23日 星期五(Workerman)

    Workerman,高性能socket服务框架 Workerman是什么? Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架. Workerman不是重复造轮子,它不是 ...

  6. 使用curl访问https

    在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具.然而在使用cr ...

  7. java各种jar的下载地址和源码下载地址

    1.jboss http://jbossmarshalling.jboss.org/downloads2.netty https://netty.io/downloads.html3.spring h ...

  8. 浅析java中clone()方法

    本文转载自:http://blog.csdn.net/mengxiangyue/article/details/6818611 Java中我们可能都遇到过这样的情况,在我们将一个对象做为参数传给一个函 ...

  9. AGC009E Eternal Average

    atc 神题orz 那个擦掉\(k\)个数然后写上一个平均值可以看成是\(k\)叉Huffman树的构造过程,每次选\(k\)个点合成一个新点,然后权值设为平均值.这些0和1都会在叶子的位置,同时每个 ...

  10. 06 基本数据结构 - 双端队列(Deque)

    一.双端队列(Deque) - 概念:deque(也称为双端队列)是与队列类似的项的有序集合.它有两个端部,首部和尾部,并且项在集合中保持不变. - 特性:deque 特殊之处在于添加和删除项是非限制 ...