P5459 [BJOI2016] 回转寿司
#include <bits/stdc++.h>
using namespace std;
long long a[100005];
long long sum[100005];
long long cnt;
int main(){
long long n,l,r;
cin >> n >> l >> r;
for(int i=1;i<=n;i++){
cin >> a[i];
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=n;i++){
long long maxn=0,minn=n+1;
long long L=i,R=n;
if(sum[1]>r){
continue;
}
while(L<=R){
int mid=(L+R)/2;
if(sum[mid]-sum[i-1]>=l){
R=mid-1;
minn=mid;
}else{
L=mid+1;
}
}
L=i,R=n;
while(L<=R){
int mid=(L+R)/2;
if(sum[mid]-sum[i-1]<=r){
L=mid+1;
maxn=mid;
}else{
R=mid-1;
}
}
cnt+=max(maxn-minn+1,0ll);
}
cout << cnt;
return 0;
}