S组 策略游戏
2026-08-12 21:04:35
发布于:浙江
8阅读
0回复
0点赞
题意省略一些:
小A想要让结果更大,小B想要让结果更小。
思路
思路很清晰,既然是区间查询一般都用ST表,但是这题不是想象中那么简单,有正数和负数的相乘性质判断。
A想要使得结果最大,B想要结果最小。
当a>=0,选择最大值,那B就需要选择最小的,才能达成目的
当 a>=0,选最小值,B也需要选最小才行
当a<0,选最大值,那B就选最大值,要么B是负数A,得到离0近一点的正数,要么B是正数A,得到离0更远的负数
当a<0选最小值,那就B也选最大值,同上的原理。
long long now=azhengda.query(l1,r1);//如果A选择正数,选择最大的一个
if(now!=-inf){
ans=max(ans,now*bxiao.query(l2,r2));//B就找最小的,这样可以让结果最小。
}
now=azhengxiao.query(l1,r1);//A选择正数中最小的,那B肯定也想要选最小的
if(now!=inf){
ans=max(ans,now*bxiao.query(l2,r2));//
}
now=afuxiao.query(l1,r1);//A是负数中最小的,B是负数的话,由于负负的正,不能选最小的。
//B是正数的话,要大一点,这样超大正数乘上超小负数,会特别小,B的目标才能实现
if(now!=inf){
ans=max(ans,now*bda.query(l2,r2));//
}
now=afuda.query(l1,r1);//A如果选了负数中最大的那一个,就是很接近零,那B也得要很大,才能让结果小的很
if(now!=-inf){
ans=max(ans,now*bda.query(l2,r2));//
}
代码参考
变量名清晰易懂
#include<bits/stdc++.h>
using namespace std;
int inf=2e9;
int n,m,q;
int a[100005],b[100005];
const int N = 1e5 + 5;
struct mn{
int f[N][20];
void init(int *a, int n) {
for (int i = 1; i <= n; i++) f[i][0] = a[i];
for (int j = 1; j < 20; j++) {
for (int i = 1; i <= n; i++) {
if ((i + (1 << (j - 1)) > n)) break;
f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
}
}
int query(int l, int r) {
int len = r - l + 1;
int x = log2(len);
return min(f[l][x], f[(r - (1 << x) + 1)][x]);
}
}azhengxiao,afuxiao,bxiao;
struct mx{
int f[N][20];
void init(int *a, int n) {
for (int i = 1; i <= n; i++) f[i][0] = a[i];
for (int j = 1; j < 20; j++) {
for (int i = 1; i <= n; i++) {
if ((i + (1 << (j - 1)) > n)) break;
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
}
}
int query(int l, int r) {
int len = r - l + 1;
int x = log2(len);
return max(f[l][x], f[(r - (1 << x) + 1)][x]);
}
}afuda,azhengda,bda;
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int c[max(n,m)+2];
for(int i=1;i<=n;i++){
if(a[i]>=0){
c[i]=a[i];
}else{
c[i]=-inf;
}
}
azhengda.init(c,n);
for(int i=1;i<=n;i++){
if(a[i]<0){
c[i]=a[i];
}else{
c[i]=-inf;
}
}
afuda.init(c,n);
for(int i=1;i<=n;i++){
if(a[i]<0){
c[i]=a[i];
}else{
c[i]=inf;
}
}
afuxiao.init(c,n);
for(int i=1;i<=n;i++){
if(a[i]>=0){
c[i]=a[i];
}else{
c[i]=inf;
}
}
azhengxiao.init(c,n);
for(int i=1;i<=m;i++){
cin>>b[i];
}
bda.init(b,m);
bxiao.init(b,m);
while(q--){
int l1,l2,r1,r2;
cin>>l1>>r1>>l2>>r2;
long long ans=-1e18;
long long now=azhengda.query(l1,r1);
if(now!=-inf){
ans=max(ans,now*bxiao.query(l2,r2));
}
now=azhengxiao.query(l1,r1);
if(now!=inf){
ans=max(ans,now*bxiao.query(l2,r2));
}
now=afuxiao.query(l1,r1);
if(now!=inf){
ans=max(ans,now*bda.query(l2,r2));
}
now=afuda.query(l1,r1);
if(now!=-inf){
ans=max(ans,now*bda.query(l2,r2));
}
cout<<ans<<endl;
}
return 0;
}
#总结
需要程序员的封装代码的能力和一些逻辑能力。
这里空空如也







有帮助,赞一个