前言
- 发现现在连搜索都不会打了……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; }