MnZn求助5459
查看原帖
MnZn求助5459
100690
lyhqwq楼主2022/5/19 19:55

树状数组RT

#include<bits/stdc++.h>
using namespace std;
struct BIT{
	int c[100005];
	int lowbit(int x){return x&(-x);}
	void update(int x,int n,int y){
		for(int i=x;i<=n;i+=lowbit(i)){
			c[i]+=y;
		}
	}
	int query(int x){
		int tot=0;
		for(int i=x;i;i-=lowbit(i)){
			tot+=c[i];
		}
		return tot;
	}
}tree;
int m,n,L,R,a[100005],sum1[100005],sum[100005];
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	scanf("%lld%lld%lld",&m,&L,&R);
	for(int i=1;i<=m;i++){
		scanf("%lld",&a[i]);
		sum1[i]=sum[i-1]+a[i];
		sum[i]=sum1[i];
	}
	sum1[m+1]=0;
	sort(sum1+1,sum1+2+m);
	n=unique(sum1+1,sum1+2+m)-sum1-1;
	tree.update(lower_bound(sum1+1,sum1+n+1,0)-sum1,m,1);
	int ans=0;
	for(int r=1;r<=m;r++){
		ans+=tree.query(upper_bound(sum1+1,sum1+n+1,sum[r]-L)-sum1-1)-tree.query(lower_bound(sum1+1,sum1+n+1,sum[r]-R)-sum1-1);
		tree.update(lower_bound(sum1+1,sum1+n+1,sum[r])-sum1,m,1);
	}
	printf("%lld",ans);
	return 0;
}

2022/5/19 19:55
加载中...