蒟蒻求助85pts

P8818 [CSP-S 2022] 策略游戏

@[YiZhiYeShengJuRuo](/user/759389) 有没有一种可能,别人看不到你的代码()
by SJH_qwq @ 2022-12-11 15:28:36


```cpp #include<iostream> #include<cstdio> using namespace std; typedef long long LL; const LL N=1e5+1,INF=1e18; LL fa1[N][32],fa2[N][32],fb1[N][32],fb2[N][32],as1[N][32],as2[N][32],lg[N]; //fa1:a->max fa2:a->min fb1:b->max fb2:b->min //as1:a>=0->min as2:a<0->max int main() { // freopen("game3.in","r",stdin); // freopen("game3.out","w",stdout); ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n,m,q,l1,r1,l2,r2; LL a1,a2,b1,b2,s1,s2; cin>>n>>m>>q; for (int i=2;i<=max(n,m);i++) lg[i]=lg[i>>1]+1;//预处理log(n) for (int i=1;i<=n;i++) { cin>>fa1[i][0]; fa2[i][0]=fa1[i][0]; if (fa1[i][0]>=0) as1[i][0]=fa1[i][0],as2[i][0]=-INF; else as1[i][0]=INF,as2[i][0]=fa1[i][0]; } for (int i=1;i<=m;i++) { cin>>fb1[i][0]; fb2[i][0]=fb1[i][0]; } for (int j=1;j<=lg[n];j++)//ST表预处理 for (int i=1;i+(1<<j)-1<=n;i++) { fa1[i][j]=max(fa1[i][j-1],fa1[i+(1<<(j-1))][j-1]); fa2[i][j]=min(fa2[i][j-1],fa2[i+(1<<(j-1))][j-1]); as1[i][j]=min(as1[i][j-1],as1[i+(1<<(j-1))][j-1]); as2[i][j]=max(as2[i][j-1],as2[i+(1<<(j-1))][j-1]); } for (int j=1;j<=lg[m];j++) for (int i=1;i+(1<<j)-1<=m;i++) { fb1[i][j]=max(fb1[i][j-1],fb1[i+(1<<(j-1))][j-1]); fb2[i][j]=min(fb2[i][j-1],fb2[i+(1<<(j-1))][j-1]); } while (q--) { cin>>l1>>r1>>l2>>r2; a1=max(fa1[l1][lg[r1-l1+1]],fa1[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]); a2=min(fa2[l1][lg[r1-l1+1]],fa2[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]); b1=max(fb1[l2][lg[r2-l2+1]],fb1[r2-(1<<lg[r2-l2+1])+1][lg[r2-l2+1]]); b2=min(fb2[l2][lg[r2-l2+1]],fb2[r2-(1<<lg[r2-l2+1])+1][lg[r2-l2+1]]); s1=min(as1[l1][lg[r1-l1+1]],as1[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]); s2=max(as2[l1][lg[r1-l1+1]],as2[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]); if (a2>=0)//a全部为非负数 { if (b2>=0) cout<<a1*b2<<"\n";//b全部为非负数 else cout<<a2*b2<<"\n";//b能取负数 } else if (a1<=0)//a全部为非正数 { if (b1<=0) cout<<a2*b1<<"\n";//b全部为负数 else cout<<a1*b1<<"\n";//b能取非负数 } else//a既能取非负数也能取负数 { if (b2>=0) cout<<a1*b2<<"\n";//b全部为非负数 else if (b1<=0) cout<<a2*b1<<"\n";//b全部为非正数 else cout<<max(s1*b2,s2*b1)<<"\n";//b既能取非负数也能取负数 } } return 0; } ```
by CH_mengxiang @ 2022-12-11 15:33:30


代码QWQ ```cpp /*This is ZJW's Code!!!*/ #include<bits/stdc++.h> #define inf (1e9) using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f*=-1; if(ch==-1)exit(0); ch=getchar(); } while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return x*f; } inline void write(int x){ if(x<0)x=-x,putchar('-'); if(x<10){putchar(x+48);return;} write(x/10);putchar(x%10+48); }const int N=3e5+10,logN=log2(N); int la[N],lb[N],a[N],b[N],n,m,q; int azx[N][logN+10],afx[N][logN+10]; int azn[N][logN+10],afn[N][logN+10]; int bzx[N][logN+10],bfx[N][logN+10]; int bzn[N][logN+10],bfn[N][logN+10]; int as0[N],bs0[N]; inline void STa(){ la[0]=-1; for(int i=1;i<=n;i++) azn[i][0]=inf,afx[i][0]=-inf; for(int i=1;i<=n;i++){ if(a[i]>0) azn[i][0]=azx[i][0]=a[i]; else if(a[i]<0) afn[i][0]=afx[i][0]=a[i]; as0[i]=as0[i-1]+(a[i]==0); la[i]=la[i>>1]+1; } for(int j=1;j<=logN;j++) for(int i=1;i+(1<<j)-1<=n;i++) azx[i][j]=max(azx[i][j-1],azx[i+(1<<(j-1))][j-1]), azn[i][j]=min(azn[i][j-1],azn[i+(1<<(j-1))][j-1]), afx[i][j]=max(afx[i][j-1],afx[i+(1<<(j-1))][j-1]), afn[i][j]=min(afn[i][j-1],afn[i+(1<<(j-1))][j-1]); } inline int azMAX(int x,int y){int s=la[y-x+1];return max(azx[x][s],azx[y-(1<<s)+1][s]);} inline int azMIN(int x,int y){int s=la[y-x+1];return min(azn[x][s],azn[y-(1<<s)+1][s]);} inline int afMAX(int x,int y){int s=la[y-x+1];return max(afx[x][s],afx[y-(1<<s)+1][s]);} inline int afMIN(int x,int y){int s=la[y-x+1];return min(afn[x][s],afn[y-(1<<s)+1][s]);} inline int aZERO(int x,int y){return(as0[y]-as0[x-1]>0);} inline void STb(){ lb[0]=-1; for(int i=1;i<=m;i++) bzn[i][0]=inf,bfx[i][0]=-inf; for(int i=1;i<=m;i++){ if(b[i]>0) bzn[i][0]=bzx[i][0]=b[i]; else if(b[i]<0) bfn[i][0]=bfx[i][0]=b[i]; bs0[i]=bs0[i-1]+(b[i]==0); lb[i]=lb[i>>1]+1; } for(int j=1;j<=logN;j++) for(int i=1;i+(1<<j)-1<=m;i++) bzx[i][j]=max(bzx[i][j-1],bzx[i+(1<<(j-1))][j-1]), bzn[i][j]=min(bzn[i][j-1],bzn[i+(1<<(j-1))][j-1]), bfx[i][j]=max(bfx[i][j-1],bfx[i+(1<<(j-1))][j-1]), bfn[i][j]=min(bfn[i][j-1],bfn[i+(1<<(j-1))][j-1]); } inline int bzMAX(int x,int y){int s=lb[y-x+1];return max(bzx[x][s],bzx[y-(1<<s)+1][s]);} inline int bzMIN(int x,int y){int s=lb[y-x+1];return min(bzn[x][s],bzn[y-(1<<s)+1][s]);} inline int bfMAX(int x,int y){int s=lb[y-x+1];return max(bfx[x][s],bfx[y-(1<<s)+1][s]);} inline int bfMIN(int x,int y){int s=lb[y-x+1];return min(bfn[x][s],bfn[y-(1<<s)+1][s]);} inline int bZERO(int x,int y){return(bs0[y]-bs0[x-1]>0);} signed main(){ cin>>n>>m>>q; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=m;i++)cin>>b[i]; STa(),STb(); for(int i=1;i<=q;i++){ int xa,ya,xb,yb; cin>>xa>>ya>>xb>>yb; int afmin=afMAX(xa,ya); int afmax=afMIN(xa,ya); int azmax=azMAX(xa,ya); int azmin=azMIN(xa,ya); int bfmin=bfMAX(xb,yb); int bfmax=bfMIN(xb,yb); int bzmax=bzMAX(xb,yb); int bzmin=bzMIN(xb,yb); int azero=aZERO(xa,ya); int bzero=bZERO(xb,yb); int aZNohave=(azmin>=inf); int bZNohave=(bzmin>=inf); int aFNohave=(!afmax); int bFNohave=(!bfmax); //cout<<!aFNohave<<"|"; if(bZNohave){//b只能选负数 if(!aFNohave)cout<<1ll*bfmin*afmax<<"\n";//a也能选负数,成为正数 else if(azero)puts("0");//能选0 else cout<<1ll*bfmax*azmin<<"\n";//a只能选正数 } else if(bFNohave){//b只能选正数 if(!aZNohave)cout<<1ll*bzmin*azmax<<"\n";//a也能选正数,答案为正数 else if(azero)puts("0");//能选0 else cout<<1ll*bzmax*afmin<<"\n";//a只能选负数 } else{//b能随便选 if(azero)puts("0"); //由于a选正负数b都能将其变为负数,故0为最优解 else{ if(aFNohave)cout<<1ll*azmin*bfmax<<"\n";//a只能选正数 else if(aZNohave)cout<<1ll*afmin*bzmax<<"\n";//a只能选负数 else{ long long t1=1ll*azmin*bfmax; long long t2=1ll*afmin*bzmax; cout<<max(t1,t2)<<"\n"; } } } }fclose(stdin); fclose(stdout); return 0; }//205 //<=老师的意大利炮 // a.revserve(); // string::npos ```
by ______l______ @ 2022-12-11 17:01:20


|