为什么单队没法过,只得80pts,但是ST表就可以过?
#include<bits/stdc++.h>
using namespace std;
#define re register
#define int long long
#define rep(i,x,y) for(re int i=x;i<=y;++i)
const int N=1e6+10,Lg=__lg(N)+1;
void qread(re int &x){
static char buf[1<<16],*s=buf,*t=buf;
#define gc s==t&&(t=(s=buf)+fread(buf,1,1<<16,stdin),s==t)?EOF:*s++
re char ch; x=0; while(!isdigit(ch=gc));
do x=(x<<1)+(x<<3)+(ch&15); while(isdigit(ch=gc));
}
int n,a[N],b[N],c[N],d[N],E,len,sum[N],q[N],hh=1,tt;
#define ch(x) max(0ll,a[x]-b[x])
#define mn(x) min(a[x],b[x])
int get(re int l,re int r){
if(l>r) return -1e18;
if(hh>tt) return mn(r);
return max(mn(q[hh]),mn(r));
}
void add(re int p,re int x){
for(;p;p&=p-1) sum[p]+=x;
}
int ask(re int p){
re int res=0;
for(;p<=len+10;p+=p&-p) res+=sum[p];
return res;
}
main(){
qread(n);qread(E);
rep(i,1,n) qread(a[i]);
rep(i,1,n) qread(b[i]),c[i]=d[i+1]=c[i-1]+(b[i]-a[i]);
sort(d+1,d+n+2),len=unique(d+1,d+n+2)-(d+1);
rep(i,0,n) c[i]=lower_bound(d+1,d+len+1,c[i])-d+5;
re int ans=0,r=1;
rep(l,1,n){
for(;r<=n&&get(l,r)<=E-ch(r);++r){//get(l,r) 改用st表处理就满分了
while(hh<=tt&&mn(q[tt])<=mn(r)) --tt;
q[++tt]=r,add(c[r],1),E-=ch(r);
}
ans+=ask(c[l-1]);
add(c[l],-1),E+=ch(l);
while(hh<=tt&&q[hh]<=l) ++hh;
}
cout<<ans<<'\n';
}