CQOI2009 中位数 思维 前缀和
题意
给出(1-n)的一个排列。统计该排列有多少个长度为奇数的连续子序列的中位数是(b)。
[1leq nleq 10^5
]
分析
考虑到需要统计的东西只和相对大小有关。不妨把序列看成只由(0,-1,1)组成的。
那么就变成了求包含0且和为0的子串个数。
这就很简单了,只需要从(pos)开始求左边的后缀和,右边的前缀和即可。
由于存在负数,不妨用(map)记录。
代码
unordered_map<int, int> mp;
int n, b;
int a[100005];
int main() {
n = readint();
b = readint();
int pos = 0;
for (int i = 1; i <= n; i++) {
a[i] = readint();
if (a[i] == b) pos = i;
}
int suml, sumr;
suml = sumr = 0;
ll res = 0;
for (int l = pos; l >= 1; l--) {
if (a[l] > b) suml++;
else if (a[l] < b) suml--;
mp[suml]++;
}
for (int r = pos; r <= n; r++) {
if (a[r] > b) sumr++;
else if (a[r] < b) sumr--;
res += mp[-sumr];
}
Put(res);
}