长话短说,先更新后查询的代码wa了,先查询后更新的代码ac了。见注释处。
怀疑存在L==0的数据。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=100005;
const ll mod=1e9+7;
const ll INF=1e12;
ll n,L,R,sum[MAXN],ans;
ll rt,rtcnt;
struct ST{
ll l,r,v;
}st[MAXN*200];
void upd(ll &i,ll tl,ll tr,ll num){
if(!i) i=++rtcnt;
st[i].v++;
if(tl==tr) return;
ll mid=tl+tr>>1;
if(mid>=num) upd(st[i].l,tl,mid,num);
if(mid+1<=num) upd(st[i].r,mid+1,tr,num);
}
ll qry(ll &i,ll tl,ll tr,ll l,ll r){
if(!i) return 0;
if(tl>=l&&tr<=r){
return st[i].v;
}
ll mid=tl+tr>>1,ret=0;
if(mid>=l) ret+=qry(st[i].l,tl,mid,l,r);
if(mid+1<=r) ret+=qry(st[i].r,mid+1,tr,l,r);
return ret;
}
int main(){
scanf("%lld%lld%lld",&n,&L,&R);
upd(rt,-INF,INF,0);
for(ll i=1;i<=n;i++){
scanf("%lld",&sum[i]);
sum[i]+=sum[i-1];
ans+=qry(rt,-INF,INF,sum[i]-R,sum[i]-L);
upd(rt,-INF,INF,sum[i]);//如果先upd在qry就wa了
}
printf("%lld",ans);
return 0;
}