mxqz
查看原帖
mxqz
246331
mystic_qwq楼主2024/10/10 17:49

为什么单队没法过,只得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';
}
2024/10/10 17:49
加载中...