前言

  • 发现现在连搜索都不会打了……T2可以搜索的。
  • 期望题一旦卡精度我一般都会爆零啊。
  • 还是要自己推柿子。

T1

  • 先处理出两个前缀和数组$a_i,b_i$。
  • 问题转换成了点对$(a_i,b_i,w_i)$的三维偏序问题。
  • 然而并不会CDQ,所以将点对按$a_i$排序,然后用线段树或树状数组维护就行了。
  • 时间复杂度$\Theta(NlogN)$,空间复杂度$\Theta(N)$。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define getchar() ((S==T&&(T=(S=buf)+fread(buf,1,L,stdin),S==T))?EOF:*S++)
int const N=5e5+5,L=1<<20|1;
int n,ans,tot;
char buf[L],*S,*T;
ll a[N],b[N];
struct Pair{
    ll fir;
    int sec;
    Pair(){}
    Pair(ll x,int y):fir(x),sec(y){}
}s[N];
struct node{
    ll fr;
    int sc,id;
}c[N];
int BIT[N];
inline int read(){
    int ss(0),pp(1);char bb(getchar());
    for(;bb<48||bb>57;bb=getchar())if(bb=='-')pp=-1;
    while(bb>=48&&bb<=57)ss=(ss<<1)+(ss<<3)+(bb^48),bb=getchar();
    return ss*pp;
}
inline int _min(int x,int y){
    return x<y?x:y;
}
inline int _max(int x,int y){
    return x>y?x:y;
}
inline int ask(int x){
    int as=N;
    while(x)as=_min(as,BIT[x]),x-=x&-x;
    return as;
}
inline void add(int x,int y){
    while(x<=tot)BIT[x]=_min(y,BIT[x]),x+=x&-x;
    return ;
}
int main(){
    //freopen("sequence.in","r",stdin);
    //freopen("1.out","w",stdout);
    n=read();
    for(register int i=1;i<=n;++i)a[i]=a[i-1]+read();
    for(register int i=1;i<=n;++i){
        s[i]=Pair(b[i]=b[i-1]+read(),i);
        if(a[i]>=0&&b[i]>=0)ans=i;
    }
    std::sort(s+1,s+n+1,[](Pair skyh,Pair yxs){
        return skyh.fir<yxs.fir;
    });
    s[0].fir=s[1].fir-1;
    for(register int i=1;i<=n;++i)
        b[s[i].sec]=tot=tot+(s[i].fir!=s[i-1].fir);
    for(register int i=1;i<=n;++i)
        c[i].fr=a[i],c[i].sc=b[i],c[i].id=i;
    std::sort(c+1,c+n+1,[](node skyh,node yxs){
        return (skyh.fr^yxs.fr)?skyh.fr<yxs.fr:skyh.sc<yxs.sc;
    });
    memset(BIT,0x3f,tot+1<<2);
    for(register int i=1;i<=n;++i)
        ans=_max(ans,c[i].id-ask(c[i].sc)),add(c[i].sc,c[i].id);
    printf("%d",ans);
    return 0;
}
View Code

相关文章: