线段树做法,但是遇到了一个很离谱的错误

P8818 [CSP-S 2022] 策略游戏

调出来了,此贴完 ```cpp #include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+7; const int K=1e9+7; int n,m,q,anss=-(K*K),a[N],b[N]; int f[10],g[10];//分别存a数组和b数组的四个ans的值 struct hhh { int l,r,mid,ans1,ans2,ans3,ans4;//ans1是区间最大值 ans2是区间最小值 ans3是区间最大负数 ans4是区间最小正数 } v1[4*N],v2[4*N]; void chu() { f[1]=-K; f[2]=K; f[3]=-K; f[4]=K; g[1]=-K; g[2]=K; g[3]=-K; g[4]=K; } void build1(int x,int s,int t) { v1[x].l=s; v1[x].r=t; v1[x].mid=(s+t)/2; if(s==t) { v1[x].ans1=a[t]; v1[x].ans2=a[t]; if(a[t]<0) v1[x].ans3=a[t],v1[x].ans4=K; else v1[x].ans3=-K,v1[x].ans4=a[t]; return ; } build1(2*x,s,v1[x].mid); build1(2*x+1,v1[x].mid+1,t); v1[x].ans1=max(v1[2*x].ans1,v1[2*x+1].ans1); v1[x].ans2=min(v1[2*x].ans2,v1[2*x+1].ans2); v1[x].ans3=max(v1[2*x].ans3,v1[2*x+1].ans3); v1[x].ans4=min(v1[2*x].ans4,v1[2*x+1].ans4); } void build2(int x,int s,int t) { v2[x].l=s; v2[x].r=t; v2[x].mid=(s+t)/2; if(s==t) { v2[x].ans1=b[t]; v2[x].ans2=b[t]; if(b[t]<0) v2[x].ans3=b[t],v2[x].ans4=K; else v2[x].ans3=-K,v2[x].ans4=b[t]; return ; } build2(2*x,s,v2[x].mid); build2(2*x+1,v2[x].mid+1,t); v2[x].ans1=max(v2[2*x].ans1,v2[2*x+1].ans1); v2[x].ans2=min(v2[2*x].ans2,v2[2*x+1].ans2); v2[x].ans3=max(v2[2*x].ans3,v2[2*x+1].ans3); v2[x].ans4=min(v2[2*x].ans4,v2[2*x+1].ans4); } void ask1(int x,int s,int t) { if(v1[x].l>=s&&v1[x].r<=t) { f[1]=max(v1[x].ans1,f[1]); f[2]=min(v1[x].ans2,f[2]); f[3]=max(v1[x].ans3,f[3]); f[4]=min(v1[x].ans4,f[4]); return ; } if(v1[x].mid>=s) ask1(2*x,s,t); if(v1[x].mid<t) ask1(2*x+1,s,t); } void ask2(int x,int s,int t) { if(v2[x].l>=s&&v2[x].r<=t) { g[1]=max(v2[x].ans1,g[1]); g[2]=min(v2[x].ans2,g[2]); g[3]=max(v2[x].ans3,g[3]); g[4]=min(v2[x].ans4,g[4]); return ; } if(v2[x].mid>=s) ask2(2*x,s,t); if(v2[x].mid<t) ask2(2*x+1,s,t); } signed main() { ios::sync_with_stdio(0); cin.tie(0); chu(); cin>>n>>m>>q; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) cin>>b[i]; build1(1,1,n); build2(1,1,m); for(int i=1;i<=q;i++) { int l1,l2,r1,r2; cin>>l1>>r1>>l2>>r2; ask1(1,l1,r1); ask2(1,l2,r2); for(int j=1;j<=4;j++) { int ddd=K*K; if(f[j]!=K&&f[j]!=-K) { for(int k=1;k<=4;k++) if(g[k]!=K&&g[k]!=-K)ddd=min(ddd,f[j]*g[k]); anss=max(ddd,anss); } } cout<<anss<<'\n'; chu(); anss=-(K*K); } return 0; } ```
by zlinda @ 2023-02-06 21:11:58


|