• ARC075 E.Meaningful Mean(树状数组)


    题目大意:给定n和k,问an中有多少子区间的平均值大于等于k

    很巧妙的一个式子,就是如果一个区间[l, r]满足条件

    那么则有

    sum[r] - sum[l-1] >= (r-l+1)*k

    整理一下就是sum[r] - r*k >= sum[l-1] - (l-1)*k

    然后先离散一下,用树状数组就可以了

    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <cstdio>
    #include <map>
    using namespace std;
    typedef long long LL;
    const int maxn = 2e5 + 100;
    int n, k;
    LL a[maxn], c[maxn*4];
    map<LL, int> M;
    vector<LL> V;
    void Modify(int x, int s){
        for(; x <= n; x += x&(-x)) c[x] += s;
    }
    LL Query(int y){
        if(y <= 0) return 0;
        LL ans = 0;
        for(int x = y; x; x -= x&(-x)) ans += c[x];
        return ans;
    }
    
    int main()
    {
        int x;
        scanf("%d %d", &n, &k);
        for(int i = 1; i <= n; i++) scanf("%d", &x), a[i] = x;
        LL sum = 0;
        for(int i = 1; i <= n; i++) {
            sum += a[i];
            sum -= k;
            V.push_back(sum);
        }
        sort(V.begin(), V.end());
        for(int i = 0; i < V.size(); i++) M[V[i]] = i+1;
        sum = 0;
        LL ans = 0;
        for(int i = 1; i <= n; i++){
            sum += a[i];
            sum -= k;
            ans += Query(M[sum]);
            if(sum >= 0) ans++;
            Modify(M[sum], 1);
        }
        cout<<ans<<endl;
    }
  • 相关阅读:
    linux 计划任务
    linux 进程管理
    PHP中global与$GLOBALS['']的区别
    php预定义变量
    linux 强制终止进程命令
    mysql取某表中数据的随机的方法
    mysql 连接 选库 查询
    Python 的异步 IO:Asyncio 简介
    并发和并行的区别
    asyncio模块中的Future和Task
  • 原文地址:https://www.cnblogs.com/Saurus/p/7056721.html
Copyright © 2020-2023  润新知