Loading

CQOI2009 中位数 思维 前缀和

CQOI2009 中位数 思维 前缀和

题意

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

\[1\leq n\leq 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);
}
posted @ 2020-09-29 22:27  MQFLLY  阅读(122)  评论(0)    收藏  举报