代码对考场(记忆中)代码进行了一些修改,和一些题解的代码很相似,但是考场上获得了 80pts,这里只有 20pts,求调 qwq。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
#define ll long long
ll inline read()
{
ll num=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='0')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
return num*f;
}
int n,ans;ll E;
ll a[N],b[N],d[N],s[N],p[N],sd[N];
struct STable
{
ll st[22][N];
void build()
{
for(int i=1;i<=n;i++)st[0][i]=p[i];
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j+(1<<i)-1<=n;j++)
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
}
ll ask(int l,int r)
{
int t=__lg(r-l+1);
return min(st[t][l],st[t][r-(1<<t)+1]);
}
}ST;
#define lb (x&-x)
struct BIT
{
int t[N];
void add(int x,int v){while(x<=n)t[x]+=v,x+=lb;}
int ask(int x){int res=0;while(x)res+=t[x],x-=lb;return res;}
}T;
ll c[N];
void discret(ll A[N])
{
for(int i=0;i<=n;i++)c[i]=A[i];
sort(c,c+1+n);
int l=unique(c,c+1+n)-c;
for(int i=0;i<=n;i++)A[i]=lower_bound(c,c+1+l,A[i])-c+1;
}
int main(){
n=read();E=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)b[i]=read();
for(int i=1;i<=n;i++)
{
d[i]=min(0ll,b[i]-a[i]);
s[i]=s[i-1]+b[i]-a[i];
p[i]=-a[i]-d[i];
sd[i]=sd[i-1]+d[i];
}
for(int i=0;i<=n;i++)printf("%lld ",s[i]);printf("\n\n");
discret(s);ST.build(); // 注意 s[0] 也要离散化
for(int i=0;i<=n;i++)printf("%lld ",s[i]);printf("\n\n");
for(int L=1,R=1;L<=n;L++)
{
ll sum=sd[R]-sd[L-1],mn=ST.ask(L,R);
while(R<=n)
{
if(sum+mn+E>=0)T.add(s[R++],1),sum+=d[R],mn=min(mn,p[R]);
else break;
}
ans+=R-L-T.ask(s[L-1]-1);
if(L==R)R++;else T.add(s[L],-1);
}
printf("%d",ans);
return 0;
}