luogu数据100pts,官方数据65pts求助

P8818 [CSP-S 2022] 策略游戏

```cpp #include<bits/stdc++.h> using namespace std; long long n,m,q,a1[400001],a2[400001],a3[400001],a4[400001],b1[400001],b2[400001],b3[400001],b4[400001],a[100001],b[100001],l1,r1,l2,r2,t1,t2,op1,op2; void build1(long long l,long long r,long long rt) {if(l==r) { scanf("%lld",&a1[rt]); a[++t1]=a1[rt]; a2[rt]=a1[rt]; if(a1[rt]>=0) { a3[rt]=a1[rt]; } if(a1[rt]<0) { a4[rt]=a1[rt]; } return; } long long mid=(l+r)/2; build1(l,mid,rt*2); build1(mid+1,r,rt*2+1); a1[rt]=max(a1[rt*2],a1[rt*2+1]); a2[rt]=min(a2[rt*2],a2[rt*2+1]); a3[rt]=min(a3[rt*2],a3[rt*2+1]); a4[rt]=max(a4[rt*2],a4[rt*2+1]); } void build2(long long l,long long r,long long rt) {if(l==r) { scanf("%lld",&b1[rt]); b[++t2]=b1[rt]; b2[rt]=b1[rt]; if(b1[rt]>=0) { b3[rt]=b1[rt]; } if(b1[rt]<0) { b4[rt]=b1[rt]; } return; } long long mid=(l+r)/2; build2(l,mid,rt*2); build2(mid+1,r,rt*2+1); b1[rt]=max(b1[rt*2],b1[rt*2+1]); b2[rt]=min(b2[rt*2],b2[rt*2+1]); b3[rt]=min(b3[rt*2],b3[rt*2+1]); b4[rt]=max(b4[rt*2],b4[rt*2+1]); } long long query1(long long l,long long r,long long ll,long long rr,long long rt) {if(ll<=l&&rr>=r) { return a1[rt]; } long long mid=(l+r)/2; long long res=-0x3f3f3f3f3f; if(ll<=mid) { res=max(res,query1(l,mid,ll,rr,rt*2)); } if(rr>mid) { res=max(res,query1(mid+1,r,ll,rr,rt*2+1)); } return res; } long long query2(long long l,long long r,long long ll,long long rr,long long rt) {if(ll<=l&&rr>=r) { return a2[rt]; } long long mid=(l+r)/2; long long res=0x3f3f3f3f3f; if(ll<=mid) { res=min(res,query2(l,mid,ll,rr,rt*2)); } if(rr>mid) { res=min(res,query2(mid+1,r,ll,rr,rt*2+1)); } return res; } long long query3(long long l,long long r,long long ll,long long rr,long long rt) {if(ll<=l&&rr>=r) { return b1[rt]; } long long mid=(l+r)/2; long long res=-0x3f3f3f3f3f; if(ll<=mid) { res=max(res,query3(l,mid,ll,rr,rt*2)); } if(rr>mid) { res=max(res,query3(mid+1,r,ll,rr,rt*2+1)); } return res; } long long query4(long long l,long long r,long long ll,long long rr,long long rt) {if(ll<=l&&rr>=r) { return b2[rt]; } long long mid=(l+r)/2; long long res=0x3f3f3f3f3f; if(ll<=mid) { res=min(res,query4(l,mid,ll,rr,rt*2)); } if(rr>mid) { res=min(res,query4(mid+1,r,ll,rr,rt*2+1)); } return res; } long long query5(long long l,long long r,long long ll,long long rr,long long rt) {if(ll<=l&&rr>=r) { return a3[rt]; } long long mid=(l+r)/2; long long res=0x3f3f3f3f3f; if(ll<=mid) { res=min(res,query5(l,mid,ll,rr,rt*2)); } if(rr>mid) { res=min(res,query5(mid+1,r,ll,rr,rt*2+1)); } return res; } long long query6(long long l,long long r,long long ll,long long rr,long long rt) {if(ll<=l&&rr>=r) { return a4[rt]; } long long mid=(l+r)/2; long long res=-0x3f3f3f3f3f; if(ll<=mid) { res=max(res,query6(l,mid,ll,rr,rt*2)); } if(rr>mid) { res=max(res,query6(mid+1,r,ll,rr,rt*2+1)); } return res; } long long query7(long long l,long long r,long long ll,long long rr,long long rt) {if(ll<=l&&rr>=r) { return b3[rt]; } long long mid=(l+r)/2; long long res=0x3f3f3f3f3f; if(ll<=mid) { res=min(res,query7(l,mid,ll,rr,rt*2)); } if(rr>mid) { res=min(res,query7(mid+1,r,ll,rr,rt*2+1)); } return res; } long long query8(long long l,long long r,long long ll,long long rr,long long rt) {if(ll<=l&&rr>=r) { return b4[rt]; } long long mid=(l+r)/2; long long res=-0x3f3f3f3f3f; if(ll<=mid) { res=max(res,query8(l,mid,ll,rr,rt*2)); } if(rr>mid) { res=max(res,query8(mid+1,r,ll,rr,rt*2+1)); } return res; } int main() {//freopen("1.in","r",stdin); //freopen("1.out","w",stdout); scanf("%lld%lld%lld",&n,&m,&q); memset(a1,-0x3f3f3f3f3f,sizeof(a1)); memset(a2,0x3f3f3f3f3f,sizeof(a2)); memset(a3,0x3f3f3f3f3f,sizeof(a3)); memset(a4,-0x3f3f3f3f3f,sizeof(a4)); memset(b1,-0x3f3f3f3f3f,sizeof(b1)); memset(b2,0x3f3f3f3f3f,sizeof(b2)); memset(b3,0x3f3f3f3f3f,sizeof(b3)); memset(b4,-0x3f3f3f3f3f,sizeof(b4)); build1(1,n,1); build2(1,m,1); for (long long i=1; i<=q; ++i) { scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2); op1=op2=0; if(l2==r2) { if(l1==r1) { printf("%lld\n",a[l1]*b[l2]); continue; } if(b[l2]>=0) { op1=1; printf("%lld\n",b[l2]*query1(1,n,l1,r1,1)); continue; } else { op2=1; printf("%lld\n",b[l2]*query2(1,n,l1,r1,1)); continue; } } if(l1==r1) { if(a[l1]>=0) { printf("%lld\n",a[l1]*query4(1,m,l2,r2,1)); } else { printf("%lld\n",a[l1]*query3(1,m,l2,r2,1)); } continue; } if(query3(1,m,l2,r2,1)>=0) { op1=1; } if(query4(1,m,l2,r2,1)<0) { op2=1; } if(op1&&!op2) { printf("%lld\n",query1(1,n,l1,r1,1)*query4(1,m,l2,r2,1)); continue; } if(!op1&&op2) { printf("%lld\n",query2(1,n,l1,r1,1)*query3(1,m,l2,r2,1)); continue; } if(op1&&op2) { if(query1(1,n,l1,r1,1)>=0) { long long p=query5(1,n,l1,r1,1)*query4(1,m,l2,r2,1); if(query2(1,n,l1,r1,1)<0) { long long q=query6(1,n,l1,r1,1)*query3(1,m,l2,r2,1); if(p>=q) { printf("%lld\n",p); continue; } if(p<q) { printf("%lld\n",q); continue; } } else { printf("%lld\n",p); continue; } } else { long long q=query6(1,n,l1,r1,1)*query3(1,m,l2,r2,1); printf("%lld\n",q); continue; } } } return 0; } ```
by 1836796ad @ 2022-11-10 12:44:01


您这写得也太……建议整个结构体封装一下
by Fan_sheng @ 2022-11-10 13:23:19


|