题目大意

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

最新文章

  1. 深入seajs源码系列二
  2. NOIP2006金明的预算方案[DP 有依赖的背包问题]
  3. codeforce Group Photo 2 (online mirror version)
  4. Chrome插件开发入门(二)——消息传递机制
  5. win8.1 环境下搭建PHP5.5.6+Apache2.4.7
  6. oledb方式读取excel文件
  7. Xcode中实现ARC和MRC混编
  8. rcp命令
  9. module.exports与exports,export和export default
  10. 关于Vue修改默认的build文件存放的dist路径
  11. 2017-12-20python全栈9期第五天第一节之昨日内容回顾和作业讲解之字母变大写
  12. XSS学习(二)
  13. ambiguous
  14. Python print打印
  15. Hi3518EV200音频相关
  16. Code Signal_练习题_stringsRearrangement
  17. mybatis 是如何与数据表对应上的 ?
  18. windows下启动与停止服务
  19. 关于Python运行代码报错:SyntaxError: Non-ASCII character &#39;\xe5&#39; in file的解决方法
  20. C++ Explicit Constructors(显式构造函数)

热门文章

  1. jsp文件
  2. spring配置文件拆分策略及方法
  3. 2019.07.05 纪中_B
  4. Python-RabbitMQ-RPC(非阻塞版)
  5. C数据结构排序算法——直接插入排序法用法总结(转http://blog.csdn.net/lg1259156776/)
  6. 简单搭建http服务器-HttpListener使用
  7. 深入理解hadoop之机架感知
  8. 启动web项目报错:The server time zone value &#39;�й���׼ʱ��&#39; is unrecognized or represents more than one time zone.
  9. 前端框架:Angular React 和 Vue的比较
  10. 多线程的些许理解(平台x86,具体考虑linux,windows)