ARC075 E.Meaningful Mean(树状数组)

编程入门 行业动态 更新时间:2024-10-08 08:23:10

ARC075 E.Meaningful Mean(<a href=https://www.elefans.com/category/jswz/34/1766397.html style=树状数组)"/>

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;
}

 

转载于:.html

更多推荐

ARC075 E.Meaningful Mean(树状数组)

本文发布于:2024-03-06 16:40:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1715821.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:树状   数组   Meaningful

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!