求中位数为K的区间的数目
给定一个长为 $n$ 的序列和常数 $k$,求此序列的中位数为 $k$ 的区间的数量。一个长为 $m$ 的序列的中位数定义为将此序列从小到大排序后第 $\lceil m / 2 \rceil$ 个数。
解法
直接考虑中位数等于 $k$ 的区间是比较困难的,我们转而考虑中位数大于等于 $k$ 的区间个数。按题目中所采用中位数定义,一个序列的中位数大于等于 $k$ 当且仅当序列中大于等于 $k$ 的元素的数目超过序列长度的一半。
对于某个固定的 $k$,将序列中大于等于 $k$ 的元素替换成 $1$,小于 $k$ 的元素替换成 $-1$,则区间的中位数大于等于 $k$ 就等价于区间和大于 $0$ 。从而可以用树状数组求出区间和大于 $0$ 的区间个数。复杂度 $O(n\log n)$ 。
若中位数的定义改成排序后第 $\lceil (m +1)/ 2 \rceil$ 个数,只要将算法稍加修改即可。
优化
给定一个长度为 $n$ 的由 $-1$、$1$ 构成的序列 $a$,求区间和大于 $0$ 的区间数目。这个问题可以在 $O(n)$ 的时间内解决。
设 $a$ 序列的前缀和序列为 $s$,则当我们考虑以 $i$ 为右端点的满足条件的区间数时,只需要知道 $s[1..i-1]$ 中小于 $s[i]$ 的元素的数目,把这个值记作 $c[i]$。而 $s[i]$ 和 $s[i-1]$ 必定相差 $1$ 或 $-1$ 。考虑 $a[i]=1$ 的情形,此时 $s[i] = s[i-1] + 1$,因此有 $c[i]$ 等于 $c[i-1]$ 加上 $s[i..i-1]$ 中 $s[i-1]$ 出现的次数。由于 $s[i]$ 最多有 $O(n)$ 个不同取值,我们可以用一个数组动态维护 $s[1..i]$ 中每个数出现的次数,这样就可以 $O(1)$ 地由 $c[i-1]$ 算出 $c[i]$ 。
Reference
http://codeforces.com/blog/entry/18879#comment-238126
求中位数为K的区间的数目的更多相关文章
- 2017第八届蓝桥杯 K倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 蓝桥杯试题 k倍区间(dp)
问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- k倍区间
看大佬的代码看了半天,终于算是懂了 标题: k倍区间 给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就 ...
- 第八届蓝桥杯省赛 K倍区间
问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- k倍区间 前缀和【蓝桥杯2017 C/C++ B组】
标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...
- 蓝桥杯-k倍区间
http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, .. ...
- k倍区间:前缀和
[蓝桥杯][2017年第八届真题]k倍区间 题目描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数 ...
- K倍区间 蓝桥杯
问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 【题解】51nod 1685第K大区间2
二分答案+++++++(。・ω・。) 感觉这个思路好像挺常用的:求第\(K\) 大 --> 二分第 \(K\) 大的值 --> 检验当前二分的值排名是第几.前提:排名与数值大小成单调性变化 ...
随机推荐
- java基础面试题:写clone()方法时,通常都有一行代码,是什么?
clone()方法 与new constructor()构造器创建对象不同 是克隆一个新的对象 package com.swift; public class Clone_Test { public ...
- Mysql5.7自定义函数递归报错1424 Recursive stored functions and triggers are not allowed
示例: DELIMITER $$CREATE FUNCTION test(countnum INT)RETURNS INT DETERMINISTICBEGINDECLARE tempnum INT ...
- Freemaker基于word模板动态导出汇总整理
Freemaker基于word模板动态导出汇总整理 一.使用的jar包: 二.Word模板动态导出的基本思路: 1.首先通过自己在word中创建好需要导出的word文本+表格的模板,模板中需要填写内容 ...
- Nginx认证
Nginx 的 ngx_http_auth_basic_module模块允许通过使用“HTTP基本认证”协议验证用户名和密码来限制对资源的访问. 配置举例: location / { auth_bas ...
- Firebase Cloud Function 编写与部署
1.设置和初始化 Firebase SDK for Cloud Functions (1).Cloud Functions 运行的是 Node v6.14.0,因此需要安装nodejs: https: ...
- CCPC 2016-2017, Finals
A. HDU 5999 The Third Cup is Free 简单模拟. B. HDU 6000 Wash n 件衣服, m 个洗衣机,k 个烘干机.每个洗衣机和烘干机需要不同的时间.问 n 件 ...
- POJ:2185-Milking Grid(KMP找矩阵循环节)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Description Every morning when they are milked, ...
- Mysql密码加密方式
以Mysql 4.1版本为分界线,两种加密方式 Mysql323加密:(16位) select old_password('root'); //Mysql自带加密函数old_password(str ...
- golang echo livereload
echo on port 1323 gin -a 1323 run server.go go get github.com/codegangsta/gin gin -h
- 关于RelativeLayout设置垂直居中对齐不起作用的问题
直接上代码 1.原有代码:(红色字体部分不起作用,无法让RelativeLayout中的textview居中) <RelativeLayout Android:id="@+id/aut ...