树状数组,问题求解
查看原帖
树状数组,问题求解
1190741
Violet_Evergardon楼主2024/8/26 16:59
#include<bits/stdc++.h>
using namespace std;
const long long N=1e5+5;
long long t[N];
long long a[N],b[N],L,R,n;
inline int lowbit(int x){return x&-x;}
inline int query(int x){
	int ans=0;
	while(x){
		ans+=t[x];
		x-=lowbit(x);
	}
	return ans;
}
inline void add(int x){
	while(x<=n){
		t[x]++;
		x+=lowbit(x);
	}
}
int main(){
	long long ans=0;
	cin>>n>>L>>R;
	for(int i=1;i<=n;i++)	cin>>a[i],a[i]+=a[i-1],b[i]=a[i];
	sort(b+1,b+2+n);
	add(lower_bound(b+1,b+n+1,0)-b);//1
	for(int i=1;i<=n;i++){
		int l=lower_bound(b+1,b+1+n,a[i]-R)-b-1,
		r=upper_bound(b+1,b+1+n,a[i]-L)-b-1;
		ans+=query(r)-query(l);//2
		add(lower_bound(b+1,b+1+n,a[i])-b);//3
	}
	cout<<ans;
	return 0;
}

1.为什么要在-1处加1?

2.求区间和的话为什么不是“-query(l-1)”?

3.“lower_bound(b+1,b+1+n,a[i])-b-1”不是才表示a[i]是第几个大的吗?这和上面“sort(b+1,b+2+n)”在前面加个0有什么关系?

2024/8/26 16:59
加载中...