题目

  点这里看题目。

分析

  看到中位数,当然会想到二分答案。

  考虑检查答案。自然,我们需要找出中位数小于二分值\(k\)的区间的个数。考虑构造一个\(b\):

\[b_i=(-1)^{[a_i\ge k]}
\]

  可以发现,这个\(b\)满足,如果区间\([l,r]\)的中位数小于\(k\),则\(\sum_{i=l}^r b_i>0\)。

  现在检查仍然是\(O(n^2)\)的,过不了。考虑优化。

  把\(b\)写成前缀和的形式:\(s_i=\sum_{j=1}^i b_j\)。

  那么一个区间\([l,r]\)需要被统计就对应着\(s_r-s_{l-1}>0\),也即是\(s_r>s_{l-1}\)。

  这是一个顺序对的问题,可以用树状数组统计。时间是\(O(n\log_2n\log_2(\max a))\)

  需要注意的有:

  1. 注意统计\([1,r]\)形式的区间,也即是统计\(s_r>0\)的情况。

  2. 注意树状数组下标为正。

  3. 注意总共有\(\frac {n(n+1)}{2}\)个区间。

代码

  1. #include <cstdio>
  2. typedef long long LL;
  3. #define int LL
  4. const int MAXN = 1e5 + 5;
  5. template<typename _T>
  6. void read( _T &x )
  7. {
  8. x = 0;char s = getchar();int f = 1;
  9. while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
  10. while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
  11. x *= f;
  12. }
  13. template<typename _T>
  14. void write( _T x )
  15. {
  16. if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
  17. if( 9 < x ){ write( x / 10 ); }
  18. putchar( x % 10 + '0' );
  19. }
  20. template<typename _T>
  21. _T MAX( const _T a, const _T b )
  22. {
  23. return a > b ? a : b;
  24. }
  25. template<typename _T>
  26. _T MIN( const _T a, const _T b )
  27. {
  28. return a < b ? a : b;
  29. }
  30. int BIT[MAXN];
  31. int a[MAXN], s[MAXN];
  32. int N;
  33. int lowbit( const int &x ) { return x & ( -x ); }
  34. void update( int x, const int v ) { for( ; x <= N ; x += lowbit( x ) ) BIT[x] += v; }
  35. int getSum( int x ) { int ret = 0; while( x ) ret += BIT[x], x -= lowbit( x ); return ret; }
  36. bool chk( const int len )
  37. {
  38. LL ret = 0; int mn = N;
  39. for( int i = 1 ; i <= N ; i ++ ) s[i] = a[i] >= len ? -1 : 1;
  40. for( int i = 1 ; i <= N ; i ++ ) s[i] += s[i - 1], ret += s[i] > 0, mn = MIN( mn, s[i] );
  41. for( int i = 1 ; i <= N ; i ++ ) BIT[i] = 0, s[i] += 1 - mn;
  42. for( int i = 1 ; i <= N ; i ++ ) ret += getSum( s[i] - 1 ), update( s[i], 1 );
  43. return ret <= 1ll * N * ( N + 1 ) / 4;
  44. }
  45. signed main()
  46. {
  47. int l = 1e9, r = -1;
  48. read( N );
  49. for( int i = 1 ; i <= N ; i ++ ) read( a[i] ), l = MIN( l, a[i] ), r = MAX( r, a[i] );
  50. int mid;.
  51. while( r - l > 1 )
  52. {
  53. if( chk( mid = l + r >> 1 ) ) l = mid;
  54. else r = mid - 1;
  55. }
  56. if( chk( r ) ) write( r );
  57. else write( l );
  58. putchar( '\n' );
  59. return 0;
  60. }

[ARC101B]Median of Medians的更多相关文章

  1. AtCoder - 4351 Median of Medians(二分+线段树求顺序对)

    D - Median of Medians Time limit : 2sec / Memory limit : 1024MB Score : 700 pointsProblem Statement ...

  2. AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...

  3. [AtCoder ARC101D/ABC107D] Median of Medians

    题目链接 题意:给n个数,求出所有子区间的中位数,组成另外一个序列,求出它的中位数 这里的中位数的定义是:将当前区间排序后,设区间长度为m,则中位数为第m/2+1个数 做法:二分+前缀和+树状数组维护 ...

  4. ARC 101 D - Median of Medians

    题面在这里! 这种题只能二分答案把qwwq,直接做根本做不了啊... 首先你需要知道如何通过 一个区间<=x的数有多少个 来判断x和这个区间中位数的关系. 很显然当数有至少 [L/2]+1 个( ...

  5. AtCoder Regular Contest 101 D - Median of Medians

    二分答案 然后前缀和+树状数组来判断这个答案是否大于等于数 如果我们对于一个查询,如果小于这个数令为1,大于这个数领为-1 将所有前缀和放在树状数组中,就可以查询所有sum_{l} < sum_ ...

  6. AtCoder4351 Median of Medians 二分, 树状数组

    题目大意 定义一个从小到大的数列的中位数为第 $ \frac{n}{2}+1 $ 项.求一个序列的所有连续子序列的中位数的中位数. $ (n \leqslant 100000)$ 问题分析 由于\(n ...

  7. 在vs中跑动ransac

    期间遇到很多问题. 记一个最主要的是: LINK2019 无法识别的外部符号,然后某一个函数的函数名 然后是 @@函数名 (@) 大概长成这样.或者还就根本就是 无法识别的外部符号. 解决方案: 我这 ...

  8. 查找第K小的数 BFPRT算法

    出处 http://blog.csdn.net/adong76/article/details/10071297 BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并 ...

  9. 【AtCoder】ARC101题解

    C - Candles 题解 点燃的一定是连续的一段,枚举左端点即可 代码 #include <bits/stdc++.h> #define enter putchar('\n') #de ...

随机推荐

  1. 关于mysql的metadata lock

    昨天晚上上线,却发现一个ddl语句长时间没有生效 查processlist, 发现包括ddl语句在内的众多查询提示 “Waiting for table metadata lock” 唯一没有该提示的 ...

  2. Java程序员的两项通用能力

    工作这几年来,经历了很多.从小白到中级(手机里有一款叫中国象棋的游戏,里面给对弈中电脑水平分为小白.菜鸟.新手.入门.初级.中级.高级.大师.特级大师,编程我暂且按照这样来区分). 学校教给我的是从小 ...

  3. Consul+upsync+Nginx实现动态负载均衡

    上一篇文章 <C# HttpClient 使用 Consul 发现服务> 解决了内部服务之间的调用问题, 对外提供网关服务还没有解决, 最后我选择了 nginx-upsync-module ...

  4. 【半译】扩展shutdown超时设置以保证IHostedService正常关闭

    我最近发现一个问题,当应用程序关闭时,我们的应用程序没有正确执行在IHostedService中的StopAsync方法.经过反复验证发现,这是由于某些服务对关闭信号做出响应所需的时间太长导致的.在这 ...

  5. springboot 启动报错"No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available"

    1.问题 springboot启动报错 "D:\Program Files\Java\jdk-11\bin\java.exe" -XX:TieredStopAtLevel=1 -n ...

  6. [安卓自动化测试] 001.UIAutomator初探

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  7. python 验证码处理

    一. 灰度处理,就是把彩色的验证码图片转为灰色的图片. 二值化,是将图片处理为只有黑白两色的图片,利于后面的图像处理和识别 # 自适应阀值二值化 def _get_dynamic_binary_ima ...

  8. 突发!HashiCorp禁止在中国使用企业版VAULT软件

    目录 前言 HashiCorp公司介绍 HashiCorp旗下的软件 Provision Secure Connect Run 总结 前言 昨天HashiCorp突然发布一则消息,禁止在中国使用Vau ...

  9. 如何看待 HashiCorp 官宣,不允许中国境内使用其旗下产品?

    欢迎转载,欢迎看官推荐. 前言 HashiCorp 官方宣布,不允许中国境内使用.部署和安装该企业旗下的企业版产品和软件.该公司比较知名的产品有:Terraform.Consul.Vagrant 等. ...

  10. BST and Heap详解

    BST(Binary Search Tree) 基本特点: 二叉树 集合中的数据具有可比较大小的关键码 数据之间满足BST特性 中序遍历可得到一个递增的数据序列(可作为判断一棵二叉树是否是BST的方法 ...