题目大意

定义一个从小到大的数列的中位数为第 $ \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]\)。

参考程序

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. long long n, a[ 100010 ];
  4. long long Sum[ 100010 ], l, r;
  5. long long Ans;
  6. long long Tree[ 200010 ];
  7. long long Lowbit( long long x ) { return x & -x; }
  8. void Add( long long x ) {
  9. while( x <= 200001 ) {
  10. ++Tree[ x ];
  11. x += Lowbit( x );
  12. }
  13. return;
  14. }
  15. long long Query( long long x ) {
  16. long long ans = 0;
  17. while( x ) {
  18. ans += Tree[ x ];
  19. x -= Lowbit( x );
  20. }
  21. return ans;
  22. }
  23. int main() {
  24. scanf( "%lld", &n );
  25. Ans = n * ( n + 1 ) / 4 + 1;
  26. for( long long i = 1; i <= n; ++i ) scanf( "%lld", &a[ i ] );
  27. l = 0; r = 1e9 + 1;
  28. while( l < r ) {
  29. long long mid = l + r >> 1;
  30. for( long long i = 1; i <= n; ++i )
  31. if( a[ i ] > mid ) Sum[ i ] = -1; else Sum[ i ] = 1;
  32. Sum[ 0 ] = 0;
  33. for( long long i = 1; i <= n; ++i ) Sum[ i ] += Sum[ i - 1 ];
  34. for( long long i = 0; i <= n; ++i ) Sum[ i ] += 100001;
  35. memset( Tree, 0, sizeof( Tree ) );
  36. Add( Sum[ 0 ] );
  37. long long Cnt = 0;
  38. for( long long i = 1; i <= n; ++i ) {
  39. Cnt += Query( Sum[ i ] - 1 );
  40. Add( Sum[ i ] );
  41. }
  42. if( Cnt >= Ans ) r = mid; else l = mid + 1;
  43. }
  44. printf( "%lld\n", l );
  45. return 0;
  46. }

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. [Bzoj1001][BeiJing2006]狼抓兔子(网络流/对偶图)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 看到大佬们都是对偶图过的,写了个最大流水过去了QAQ,网络流的无向图直接建双向边( ...

  2. C++学习 之 继承(笔记)

    1.继承基础: 继承就像是生物里的遗传与变异,即派生类(子代)从基类(父代)那里继承基类的某些特性(遗传),并在此基础上拥有自己的特性(变异). C++派生语法: class Base//定义一个基类 ...

  3. linux增加swap大小

    参考自:https://blog.csdn.net/ssrmygod/article/details/70157716 我在centos6.5上照着操作成功了首先查一下目前swap的大小: [root ...

  4. LintCode 53---翻转字符串中的单词

    public class Solution { /* * @param s: A string * @return: A string */ public static String reverseW ...

  5. java实现spark常用算子之filter

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  6. javascript--获取一个页面各个标签的数量

    获取一个页面各个标签的数量 document.getElementsByTagName('*')--获取所有的标签. var obj = document.getElementsByTagName(' ...

  7. avascript中实现垃圾桶的功能

    javascript中实现垃圾桶的功能,就像折垃圾桶在拖动目标上触发事件 (源元素):ondragstart - 用户开始拖动元素时触发ondrag - 元素正在拖动时触发ondragend - 用户 ...

  8. Nginx如何配置https证书?

    #把80端口请求跳转到443端口 server { listen 80; server_name 域名; return 301 https://$http_host$request_uri; } se ...

  9. json串到java对象

    json串到java对象 前端传入参数json字符串,格式如下: {"语文":"88","数学":"78"," ...

  10. Docker架构及其三要素

    1.Docker架构 a.Docker客户端和服务端   Docker是客户-服务器(C/S)架构的程序.Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并 ...