博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu1627 [CQOI2009]中位数
阅读量:5938 次
发布时间:2019-06-19

本文共 979 字,大约阅读时间需要 3 分钟。

给出一个 \(n\) 的排列,统计该排列有多少个长度为奇数的连续子序列的中位数是 \(k\)

\(n\leq10^5\)


有关中位数的 \(trick\) :因为不需要每个数的值,因此将原序列化为 \(a_i=\begin{cases}-1&(a_i<k)\\0&(a_i=k)\\1&(a_i>k)\end{cases}\)

因此原问题就变成了

给出一个 \(n\) 的排列,统计该排列有多少个包含 \(k\) 的连续子序列的和为 \(0\)

即求 \(\displaystyle\sum_{i=1}^{pos}\sum_{j=pos}^{n}[s_j-s_{i-1}=0]\)

所以我们只需枚举 \(i\) 并计数 \(\displaystyle\sum_{j=pos}^n[s_j=s_{i-1}]\),暴力存一下即可

时间复杂度 \(O(n)\)

代码

#include 
using namespace std;const int maxn = 1e5 + 10;int n, k, a[maxn], s[maxn], c[maxn << 1];int main() { scanf("%d %d", &n, &k); int pos; long long ans = 0; for (int i = 1, x; i <= n; i++) { scanf("%d", &x); if (x > k) a[i] = 1; if (x < k) a[i] = -1; if (x == k) a[i] = 0, pos = i; s[i] = s[i - 1] + a[i]; } for (int i = pos; i <= n; i++) { c[s[i] + n]++; } for (int i = 1; i <= pos; i++) { ans += c[n + s[i - 1]]; } printf("%lld", ans); return 0;}

转载于:https://www.cnblogs.com/Juanzhang/p/10341629.html

你可能感兴趣的文章
终于对了
查看>>
RabbitMQ集群
查看>>
Apache防盗链和隐藏版本信息
查看>>
ARP协议与路由
查看>>
使用pypiserver搭建私有源
查看>>
raid及mdadm
查看>>
SCI检索介绍
查看>>
Android开发之生成自己的签名文件及App签名打包
查看>>
如何提高阿里云上应用的可用性(二)
查看>>
Java NIO Channel (netty源码死磕1.3)
查看>>
云宏WinCloud前端工程师告诉你什么是UI扁平化
查看>>
如何压缩PDF文件,有什么简单的方法
查看>>
SpringMVC常用注解标签详解
查看>>
day18 Set集合
查看>>
Oracle event之db file read
查看>>
ORA 00600 [ktrexc_1]
查看>>
Docker 安装
查看>>
网络功能的“公认模型”
查看>>
如何通过Flow制作简单的工作流 - 请假审批2
查看>>
Http 以post方式获取数据
查看>>