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);
    }
    
  • 相关阅读:
    c#中的命名空间、类
    C#编写“hello,world”
    django1.9中manage.py的操作命令
    JS原生Ajax操作(XMLHttpRequest)
    Jquery百宝箱
    jQuery与Ajax入门
    JSON
    JSTL与EL表达式
    知识点整理
    Servlet与JSP进阶
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13752248.html
Copyright © 2011-2022 走看看