题目大意

定义一个从小到大的数列的中位数为第 $ \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. pycharm 更换源 Windows Linux平台

    pycharm 更换源 Windows Linux平台 参考资料:https://blog.csdn.net/wls666/article/details/95456309 Windows下更新源 文 ...

  2. 平衡树(Splay、fhq Treap)

    Splay Splay(伸展树)是一种二叉搜索树. 其复杂度为均摊\(O(n\log n)\),所以并不可以可持久化. Splay的核心操作有两个:rotate和splay. pushup: 上传信息 ...

  3. UOJ46 玄学

    题目 一个比较自然的想法是线段树维护二进制分组. 因为我们询问的是一段连续的操作的积,所以我们可以建一棵线段树,每个节点存储当前区间各个操作的积. 这里的操作的积指的是把一系列操作做完之后区间每个位置 ...

  4. Python字典推导式将cookie字符串转化为字典

    Python中的列表推导式一般是大家所熟悉的,可以极大的简洁代码:而Python中的字典推导式和列表推导式也是大同小异的 cookie: PHPSESSID=et4a33og7nbftv60j3v9m ...

  5. Django框架——基础之路由系统(urls.py)11111111

    1.URL路由系统前言 URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除 ...

  6. Nginx如何配置反向代理

    server { listen 80; server_name 代理域名; location / { proxy_pass 应用域名:应用端口; proxy_set_header Host $host ...

  7. ios 动画:底部标签栏的概念设计

    本文汇集了大量优秀的ios底部标签栏动效设计,并附上技术实现的指南,对于设计师和开发者都提供了很好的灵感来源和学习资源. 我们每天都见到tab bars,它们指引用户,使得他们能够快速在不同的tab中 ...

  8. LVS Director端服务启动脚本

    #!/bin/bash # 手动安装lpvs前端管理工具 # chkconfig: - # # lvs启动脚本:director # lvs模式类型:nat.dr.ipip # lvs代理协议:tcp ...

  9. dedecms 多级栏目时,调用上级栏目名称和链接

    {dede:field name='position' runphp='yes'} $tc="-"; //分隔符 $tw=$GLOBALS['cfg_list_symbol']; ...

  10. Bss段的作用及初始化

    初始化的全局变量:数据段 局部变量:栈 malloc:堆 未初始化的全局变量:Bss段 arm-linux-readelf -a 应用程序    可查看文件运行架构.大小端.共享库等信息 初始化Bss ...