不太懂这道题的特判

P8818 [CSP-S 2022] 策略游戏

``` #include<iostream> #define mp make_pair #define int long long using namespace std; inline int read(){ int x=0,flag=1;char ch=getchar(); while(ch<'0' || ch>'9'){if(ch=='-')flag=-1;ch=getchar();} while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return x*flag; } const int N=1e5+10; const int inf=3e18; struct Node{ int l,r,nmax,nmin; int above,below; bool zero; }; Node ta[N<<2],tb[N<<2]; Node operator +(const Node &a,const Node &b){ Node res; res.l=a.l;res.r=b.r; res.nmax=max(a.nmax,b.nmax); res.nmin=min(a.nmin,b.nmin); res.above=min(a.above,b.above); res.below=max(a.below,b.below); res.zero=a.zero&&b.zero; return res; } void builda(int p,int l,int r){ ta[p].l=l,ta[p].r=r; if(l==r){int x=read();ta[p].nmax=ta[p].nmin=x;ta[p].above=(x>=0)?x:inf;ta[p].below=(x<=0)?x:-inf;ta[p].zero=x==0;return;} int mid=(l+r)>>1; builda(p<<1,l,mid); builda(p<<1|1,mid+1,r); ta[p]=ta[p<<1]+ta[p<<1|1]; } void buildb(int p,int l,int r){ tb[p].l=l,tb[p].r=r; if(l==r){int x=read();tb[p].nmax=tb[p].nmin=x;tb[p].above=(x>=0)?x:inf;tb[p].below=(x<=0)?x:-inf;tb[p].zero=x==0;return;} int mid=(l+r)>>1; buildb(p<<1,l,mid); buildb(p<<1|1,mid+1,r); tb[p]=tb[p<<1]+tb[p<<1|1]; } int getmina(int p,int l,int r){ if(l<=ta[p].l && ta[p].r<=r) return ta[p].nmin; int mid=(ta[p].l+ta[p].r)>>1,res=inf; if(l<=mid) res=min(res,getmina(p<<1,l,r)); if(mid<r) res=min(res,getmina(p<<1|1,l,r)); return res; } int getminb(int p,int l,int r){ if(l<=tb[p].l && tb[p].r<=r) return tb[p].nmin; int mid=(tb[p].l+tb[p].r)>>1,res=inf; if(l<=mid) res=min(res,getminb(p<<1,l,r)); if(mid<r) res=min(res,getminb(p<<1|1,l,r)); return res; } int getmaxa(int p,int l,int r){ if(l<=ta[p].l && ta[p].r<=r) return ta[p].nmax; int mid=(ta[p].l+ta[p].r)>>1,res=-inf; if(l<=mid) res=max(res,getmaxa(p<<1,l,r)); if(mid<r) res=max(res,getmaxa(p<<1|1,l,r)); return res; } int getmaxb(int p,int l,int r){ if(l<=tb[p].l && tb[p].r<=r) return tb[p].nmax; int mid=(tb[p].l+tb[p].r)>>1,res=-inf; if(l<=mid) res=max(res,getmaxb(p<<1,l,r)); if(mid<r) res=max(res,getmaxb(p<<1|1,l,r)); return res; } int getabovea(int p,int l,int r){ if(l<=ta[p].l && ta[p].r<=r) return ta[p].above; int mid=(ta[p].l+ta[p].r)>>1,res=inf; if(l<=mid) res=min(res,getabovea(p<<1,l,r)); if(mid<r) res=min(res,getabovea(p<<1|1,l,r)); return res; } int getbelowa(int p,int l,int r){ if(l<=ta[p].l && ta[p].r<=r) return ta[p].below; int mid=(ta[p].l+ta[p].r)>>1,res=-inf; if(l<=mid) res=max(res,getbelowa(p<<1,l,r)); if(mid<r) res=max(res,getbelowa(p<<1|1,l,r)); return res; } bool pd(int p,int l,int r){ if(l<=ta[p].l && ta[p].r<=r) return ta[p].zero; bool res=true; int mid=(ta[p].l+ta[p].r)>>1; if(l<=mid) res=res && pd(p<<1,l,r); if(mid<r) res=res && pd(p<<1|1,l,r); return res; } signed main(){ int n=read(),m=read(),q=read(); builda(1,1,n); buildb(1,1,m); for(int i=1;i<=q;++i){ int l1=read(),r1=read(),l2=read(),r2=read(); int Lmin=getmina(1,l1,r1),Lmax=getmaxa(1,l1,r1); int Qmin=getminb(1,l2,r2),Qmax=getmaxb(1,l2,r2); if(Qmin>=0){ if(Lmax>=0) cout<<Lmax*Qmin<<'\n'; else cout<<Lmax*Qmax<<'\n'; }else if(Qmax<=0){ if(Lmin<=0) cout<<Lmin*Qmax<<'\n'; else cout<<Lmin*Qmin<<'\n'; }else{ if(pd(1,l1,r1)) {cout<<"0\n";continue;}//here if(Lmin>=0) cout<<Lmin*Qmin<<'\n'; if(Lmax<=0) cout<<Lmax*Qmax<<'\n'; if(Lmin<0 && Lmax>0){ int tmp=max(getabovea(1,l1,r1)*Qmin,getbelowa(1,l1,r1)*Qmax); cout<<tmp<<'\n'; } } } } ``` 不加那一行的话只能的95tps
by dyyzy_qwq @ 2023-09-23 11:23:36


@dyyzy 哪一行
by WrongAnswer_90 @ 2023-09-28 09:32:04


>建议加上else —— wronganswer_90 还是我太菜了(悲
by dyyzy_qwq @ 2023-09-28 09:53:05


|