写了动态开点线段树,6个点MLE,不知为何。大佬求调
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define lc tr[i].ch[0]
#define rc tr[i].ch[1]
#define mid (l+r)/2
using namespace std;
const int N=1e5;
const int Sz=9e6;
const ll inf=1e10;
int n;ll Minn,Maxn,a[N+5];
struct segNode{
int ch[2],sum;
};
int rt,cnt;
struct segTree{
segNode tr[Sz+5];
void pushup(int i){
tr[i].sum=tr[lc].sum+tr[rc].sum;
}
void update(int &i,ll l,ll r,ll val){
if(!i){
i=++cnt;
}
if(l==r){
tr[i].sum++;
return;
}
if(val<=mid){
update(lc,l,mid,val);
}else{
update(rc,mid+1,r,val);
}
pushup(i);
}
int query(int i,ll l,ll r,ll L,ll R){
if(L<=l&&R>=r||!i){
return tr[i].sum;
}
int res=0;
if(L<=mid){
res+=query(lc,l,mid,L,R);
}
if(R>mid){
res+=query(rc,mid+1,r,L,R);
}
return res;
}
}seg;
int main(){
scanf("%d%lld%lld",&n,&Minn,&Maxn);
ll sum=0,res=0;
seg.update(rt,-inf,inf,0);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
res+=seg.query(rt,-inf,inf,sum-Maxn,sum-Minn);
seg.update(rt,-inf,inf,sum);
}
printf("%lld\n",res);
return 0;
}