数组开大一些又会MLE。
#include<bits/stdc++.h>
using namespace std;
long long treet[1000005];
long long n,m,a[200005],sum[1000005],ls[1000005],rs[1000005];
long long res=0,cnt=0,t,rt;
const long long inf=1e15;
void change(long long l,long long r,long long &k,long long x)
{
if(k==0)k=++cnt;
if(l==r)
{
treet[k]++;
return;
}
long long mid=(l+r)/2;
if(x<=mid)change(l,mid,ls[k],x);
else change(mid+1,r,rs[k],x);
treet[k]=treet[ls[k]]+treet[rs[k]];
}
long long search(long long l,long long r,long long k,long long x,long long y)
{
if(x<=l&&y>=r)
{
return treet[k];
}
long long mid=(l+r)/2;
long long res=0;
if(x<=mid)res+=search(l,mid,ls[k],x,y);
if(y>mid)res+=search(mid+1,r,rs[k],x,y);
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>t;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
for(int i=n;i>=1;i--)
{
change(1,inf*2,rt,sum[i]+inf);
res+=search(1,inf*2,rt,1,sum[i-1]+t+inf-1);
//cout<<res<<"\n";
}
cout<<res;
return 0;
}