zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    【BZOJ4300】绝世好题
    codeforce1051F
    【BZOJ3329】Xorequ
    codeforce739c
    【UVA11825】
    codeforce6E
    CF 1023D Array Restoration
    BZOJ 1911 [APIO2010] 特别行动队
    POJ 3709 K-Anonymous Sequence
    BZOJ 2726 [SDOI2012] 任务安排
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13752248.html
Copyright © 2011-2022 走看看