CQOI2009 中位数 思维 前缀和

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);
}
原文地址:https://www.cnblogs.com/hznumqf/p/13752248.html