http://arc075.contest.atcoder.jp/tasks/arc075_c
题意:
给你一个序列和一个数k,求有多少对l,r,使得a[l]+a[l+1]+...+a[r]的算术平均数大于等于k
- 1≤N≤2×10^5
- 1≤K≤10^9
- 1≤ai≤10^9
思路:
首先对于所有数减去k,这样就不用除(r-l+1), 然后我们发现所求的就是有多少对l,r,使得sum[r]-sum[l-1] >= 0, sum是减去k之后的序列的前缀和
用树状数组对sum求有多少个顺序对,多加一个0这个数,代表从sum[r]-sum[0]对答案的贡献。
由于sum[i]可能很大,所以需要离散化。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 2e5+10;
ll n,k,x,s[maxn],tree[maxn];
vector<ll> v;
void add(l

该博客介绍了如何使用树状数组解决一个编程问题:给定序列和一个数k,计算序列中满足区间算术平均值大于等于k的子区间对的数量。通过将所有数值减去k简化问题,转化为寻找前缀和大于等于0的子区间。使用树状数组并进行离散化以处理可能的大数值。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



