题目大意
给定数组 A 长度 n,数组 B 长度 m,矩阵C{i,j}=Ai*Bj。
每轮查询给出l1,r1,l2,r2:
小L选x[l1,r1]
小Q看到x之后选y[l2,r2]
小L希望得分 C{x,y}尽可能大
小Q希望得分尽可能小
两人都采取最优策略,求最终得分。
暴力核心思路
小 L 选定一个Ax,小 Q 一定会选对自己最有利的 y:
如果Ax>=0:乘积要尽量小 → Q 选 B 区间最小值Bmin,得分AxBmin
如果Ax<0:负数乘大数会更小 → Q 选 B 区间最大值Bmax,得分AxBmax
小 L 知道 Q 会这么操作,所以小 L 遍历 A 区间里每一个元素,算出上面对应的得分,取最大值,就是这一轮答案。
暴力代码
#include<bits/stdc++.h>usingnamespacestd;longlongn,m,q;longlonga[1005],b[1005];intmain(){cin>>n>>m>>q;for(inti=1;i<=n;i++){cin>>a[i];}for(inti=1;i<=m;i++){cin>>b[i];}while(q--){intl1,l2,r1,r2;cin>>l1>>r1>>l2>>r2;longlongmaxn=INT_MIN,minn=INT_MAX;for(inti=l1;i<=r1;i++){maxn=max(maxn,a[i]);}for(inti=l2;i<=r2;i++){minn=min(minn,b[i]);}cout<<maxn*minn<<endl;}return0;}60分思路
每次查询循环扫 A 区间、B 区间。
手动分类讨论正负情况,拿区间的极值做乘法,直接算出答案。
变量含义
maxaz/minaz:A 区间正数的最大、最小
maxaf/minaf:A 区间负数的最大、最小
maxbz/minbz:B 区间正数的最大、最小
maxbf/minbf:B 区间负数的最大、最小
typea
1:A 区间只有正数
2:A 区间只有负数
3:A 区间既有正数又有负数
typea0标记 A 区间有没有 0;typeb0标记 B 区间有没有 0
在这里插入代码片#include<bits/stdc++.h>usingnamespacestd;longlongn,m,q,a[1005],b[1005];longlongcheck(intl1,intr1,intl2,intr2){inttypea0=0,typeb0=0;inttypea=0,typeb=0;longlongmaxaz=0,minaz=1e17,maxaf=-1e17,minaf=0;longlongmaxbz=0,minbz=1e17,maxbf=-1e17,minbf=0;longlongans=0;for(inti=l1;i<=r1;i++){if(a[i]<0){maxaf=max(maxaf,a[i]);minaf=min(minaf,a[i]);}elseif(a[i]>0){maxaz=max(maxaz,a[i]);minaz=min(minaz,a[i]);}elsetypea0=1;if(typea==3)continue;if(a[i]>0&&typea==2)typea=3;elseif(a[i]>0&&typea==0)typea=1;elseif(a[i]<0&&typea==0)typea=2;elseif(a[i]<0&&typea==1)typea=3;}for(inti=l2;i<=r2;i++){if(b[i]<0){maxbf=max(maxbf,b[i]);minbf=min(minbf,b[i]);}elseif(b[i]>0){maxbz=max(maxbz,b[i]);minbz=min(minbz,b[i]);}elsetypeb0=1;if(typeb==3)continue;if(b[i]>0&&typeb==2)typeb=3;elseif(b[i]>0&&typeb==0)typeb=1;elseif(b[i]<0&&typeb==0)typeb=2;elseif(b[i]<0&&typeb==1)typeb=3;}if(typea==1){if(typeb==1)ans=maxaz*minbz;elseif(typeb==2)ans=minaz*minbf;elseans=minaz*minbf;}elseif(typea==2){if(typeb==1)ans=maxaf*maxbz;elseif(typeb==2)ans=minaf*maxbf;elseans=maxaf*maxbz;}else{if(typeb==1)ans=maxaz*minbz;elseif(typeb==2)ans=minaf*maxbf;elseans=max(minaz*minbf,maxaf*maxbz);}if(typea0)ans=max(ans,0ll);if(typeb0)ans=min(ans,0ll);returnans;}intmain(){cin>>n>>m>>q;for(inti=1;i<=n;i++)cin>>a[i];for(inti=1;i<=m;i++)cin>>b[i];while(q--){intl1,r1,l2,r2;cin>>l1>>r1>>l2>>r2;cout<<check(l1,r1,l2,r2)<<endl;}return0;}