(策略游戏)

[CSP-S 2022] 策略游戏

题目描述

小 L 和小 Q 在玩一个策略游戏。

有一个长度为 n n n 的数组 A A A 和一个长度为 m m m 的数组 B B B,在此基础上定义一个大小为 n × m n \times m n×m 的矩阵 C C C,满足 C i j = A i × B j C_{i j} = A_i \times B_j Cij=Ai×Bj。所有下标均从 1 1 1 开始。

游戏一共会进行 q q q 轮,在每一轮游戏中,会事先给出 4 4 4 个参数 l 1 , r 1 , l 2 , r 2 l_1, r_1, l_2, r_2 l1,r1,l2,r2,满足 1 ≤ l 1 ≤ r 1 ≤ n 1 \le l_1 \le r_1 \le n 1l1r1n 1 ≤ l 2 ≤ r 2 ≤ m 1 \le l_2 \le r_2 \le m 1l2r2m

游戏中,小 L 先选择一个 l 1 ∼ r 1 l_1 \sim r_1 l1r1 之间的下标 x x x,然后小 Q 选择一个 l 2 ∼ r 2 l_2 \sim r_2 l2r2 之间的下标 y y y。定义这一轮游戏中二人的得分是 C x y C_{x y} Cxy

小 L 的目标是使得这个得分尽可能大,小 Q 的目标是使得这个得分尽可能小。同时两人都是足够聪明的玩家,每次都会采用最优的策略。

请问:按照二人的最优策略,每轮游戏的得分分别是多少?

输入格式

第一行输入三个正整数 n , m , q n, m, q n,m,q,分别表示数组 A A A,数组 B B B 的长度和游戏轮数。

第二行: n n n 个整数,表示 A i A_i Ai,分别表示数组 A A A 的元素。

第三行: m m m 个整数,表示 B i B_i Bi,分别表示数组 B B B 的元素。

接下来 q q q 行,每行四个正整数,表示这一次游戏的 l 1 , r 1 , l 2 , r 2 l_1, r_1, l_2, r_2 l1,r1,l2,r2

输出格式

输出共 q q q 行,每行一个整数,分别表示每一轮游戏中,小 L 和小 Q 在最优策略下的得分。

样例 #1

样例输入 #1

3 2 2
0 1 -2
-3 4
1 3 1 2
2 3 2 2

样例输出 #1

0
4

样例 #2

样例输入 #2

6 4 5
3 -1 -2 1 2 0
1 2 -1 -3
1 6 1 4
1 5 1 4
1 4 1 2
2 6 3 4
2 5 2 3

样例输出 #2

0
-2
3
2
-1

提示

【样例解释 #1】

这组数据中,矩阵 C C C 如下:

[ 0 0 − 3 4 6 − 8 ] \begin{bmatrix} 0 & 0 \\ -3 & 4 \\ 6 & -8 \end{bmatrix} 036048

在第一轮游戏中,无论小 L 选取的是 x = 2 x = 2 x=2 还是 x = 3 x = 3 x=3,小 Q 都有办法选择某个 y y y 使得最终的得分为负数。因此小 L 选择 x = 1 x = 1 x=1 是最优的,因为这样得分一定为 0 0 0

而在第二轮游戏中,由于小 L 可以选 x = 2 x = 2 x=2,小 Q 只能选 y = 2 y = 2 y=2,如此得分为 4 4 4

【样例 #3】

见附件中的 game/game3.ingame/game3.ans

【样例 #4】

见附件中的 game/game4.ingame/game4.ans

【数据范围】

对于所有数据, 1 ≤ n , m , q ≤ 10 5 1 \le n, m, q \le {10}^5 1n,m,q105 − 10 9 ≤ A i , B i ≤ 10 9 -{10}^9 \le A_i, B_i \le {10}^9 109Ai,Bi109。对于每轮游戏而言, 1 ≤ l 1 ≤ r 1 ≤ n 1 \le l_1 \le r_1 \le n 1l1r1n 1 ≤ l 2 ≤ r 2 ≤ m 1 \le l_2 \le r_2 \le m 1l2r2m

测试点编号 n , m , q ≤ n, m, q \le n,m,q特殊条件
1 1 1 200 200 2001, 2
2 2 2 200 200 2001
3 3 3 200 200 2002
4 ∼ 5 4 \sim 5 45 200 200 200
6 6 6 1000 1000 10001, 2
7 ∼ 8 7 \sim 8 78 1000 1000 10001
9 ∼ 10 9 \sim 10 910 1000 1000 10002
11 ∼ 12 11 \sim 12 1112 1000 1000 1000
13 13 13 10 5 {10}^5 1051, 2
14 ∼ 15 14 \sim 15 1415 10 5 {10}^5 1051
16 ∼ 17 16 \sim 17 1617 10 5 {10}^5 1052
18 ∼ 20 18 \sim 20 1820 10 5 {10}^5 105

其中,特殊性质 1 为:保证 A i , B i > 0 A_i, B_i > 0 Ai,Bi>0
特殊性质 2 为:保证对于每轮游戏而言,要么 l 1 = r 1 l_1 = r_1 l1=r1,要么 l 2 = r 2 l_2 = r_2 l2=r2

整体思路

概括题意:
在两个不同的区间里面选取两个数字,结果可以拆分为两个子问题:
1.让两个数的乘积最小(Q)
2.让两个数的乘积最大(L)
可以固定下来一个人选大的数还是小的数,让后让另一个人跟着他走一遍模拟。
这里我们选取暴力枚举L:
当L选取的数为正数的时候,q就要让他选择尽量小一点得数;
当L选的是负数的时候,Q便要选尽量大一些的数;
当L选取的数为0,那么便不用顾忌Q(反正最后的乘积都要为0)
分类讨论,依次处理即可。

ac代码

#include <bits/stdc++.h>
#define ET return 0
#define fr1(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define fr2(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
#define ll long long
#define mp make_pair
#define il inline
#define pii pair<int,int>
#define fi first
#define se second
#define il inline
#define int ll
using namespace std;
const int N=1e5+10;
int n,m,q;
int a[N],b[N];
int l1,r1,l2,r2;
#define mid ((l+r)>>1)
struct node{int maxf,minf,maxz,minz,cnt0;
};
struct Segment_Tree{int val[N<<2],minn[N<<2],maxn[N<<2],maxf[N<<2],minf[N<<2],maxz[N<<2],minz[N<<2],cnt0[N<<2];void pushup(int p){minn[p]=min(minn[p<<1],minn[p<<1|1]);maxn[p]=max(maxn[p<<1],maxn[p<<1|1]);maxf[p]=max(maxf[p<<1],maxf[p<<1|1]);minf[p]=min(minf[p<<1],minf[p<<1|1]);maxz[p]=max(maxz[p<<1],maxz[p<<1|1]);minz[p]=min(minz[p<<1],minz[p<<1|1]);cnt0[p]=cnt0[p<<1]+cnt0[p<<1|1];}void merge(node &ans,node d){ans.cnt0+=d.cnt0;ans.maxf=max(ans.maxf,d.maxf);ans.minf=min(ans.minf,d.minf);ans.maxz=max(ans.maxz,d.maxz);ans.minz=min(ans.minz,d.minz);}il void build(int p,int l,int r){maxf[p]=LONG_LONG_MIN;minf[p]=0;maxz[p]=0;cnt0[p]=0;minz[p]=LONG_LONG_MAX;if(l==r){minn[p]=maxn[p]=val[l];if(val[l]<0){maxf[p]=val[l];minf[p]=val[l];}else if(val[l]>0){maxz[p]=val[l];minz[p]=val[l];}else{cnt0[p]=1;}return;}build(p<<1,l,mid);build(p<<1|1,mid+1,r);pushup(p);}//建树 il pii query(int p,int l,int r,int ml,int mr){if(ml<=l&&r<=mr){return mp(minn[p],maxn[p]);}pii ans=mp(LONG_LONG_MAX,LONG_LONG_MIN);if(ml<=mid){pii d=query(p<<1,l,mid,ml,mr);ans.fi=min(ans.fi,d.fi);ans.se=max(ans.se,d.se);}if(mid<mr){pii d=query(p<<1|1,mid+1,r,ml,mr);ans.fi=min(ans.fi,d.fi);ans.se=max(ans.se,d.se);}return ans;}il node queryb(int p,int l,int r,int ml,int mr){if(ml<=l&&r<=mr){return {maxf[p],minf[p],maxz[p],minz[p],cnt0[p]};}node ans={LONG_LONG_MIN,0,0,LONG_LONG_MAX,0};if(ml<=mid){node d=queryb(p<<1,l,mid,ml,mr);merge(ans,d);}if(mid<mr){node d=queryb(p<<1|1,mid+1,r,ml,mr);merge(ans,d);}return ans;}
} T1,T2;//树形结构的基本操作 
#undef mid
void solve2(){while(q--){int ans=LONG_LONG_MIN; cin>>l1>>r1>>l2>>r2;node d=T1.queryb(1,1,n,l1,r1);int x=T2.query(1,1,m,l2,r2).fi;int y=T2.query(1,1,m,l2,r2).se;if(d.cnt0!=0){ans=0;}if(y>0&&d.minf!=0){ans=max(ans,y*d.maxf);}if(y<=0&&d.maxf!=LONG_LONG_MIN){ans=max(ans,y*d.minf);}if(x<=0&&d.minz!=LONG_LONG_MAX){ans=max(ans,x*d.minz);}if(x>0&&d.maxz!=0){ans=max(ans,x*d.maxz);}cout<<ans<<'\n';}
}//问题处理 
signed main(){ios::sync_with_stdio(false);cin>>n>>m>>q;fr1(i,1,n){cin>>a[i];T1.val[i]=a[i];}fr1(i,1,m){cin>>b[i];T2.val[i]=b[i];}T1.build(1,1,n);T2.build(1,1,m);solve2();ET;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测 目录 多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序…

springboot整合Sa-Token实现登录认证和权限校验(万字长文)

目前在国内的后端开发中&#xff0c;常用的安全框架有spring security、shiro。现在&#xff0c;介绍一款由国人开发的安全框架Sa-Token。这个框架完全由国人开发&#xff0c;所提供的Api文档和一些设置都是比较符合国人的开发习惯的&#xff0c;本次就来介绍一下如何在spring …

Multisim14.0仿真(四十五)AC220V转DC12V稳压电源设计

一、仿真原理图&#xff1a; 二、运行效果&#xff1a;

【Vue】组件间通信的7种方法(全)

目录 组件之前的通信方法 1. props/$emit 2.parent/children 3.ref 4.v-model 5.sync 6.attrs,attrs,attrs,listeners 7.provide/inject 7.eventBus 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进行修改 可以静态传递 也可…

机器学习系列——(九)决策树

简介 决策树作为机器学习的一种经典算法&#xff0c;在数据挖掘、分类和回归等任务中广泛应用。本文将详细介绍机器学习中的决策树算法&#xff0c;包括其原理、构建过程和应用场景。 原理 决策树是一种基于树状结构的监督学习算法&#xff0c;它通过构建一棵树来对数据进行分…

【Rust】——基础Hello_world

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

68.Spring MVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?

Spring MVC的控制器是不是单例模式,如果是,有什么问题,怎么解决&#xff1f; 在 Spring MVC 中&#xff0c;默认情况下控制器是单例模式&#xff0c;也就是说&#xff0c;每个控制器类只有一个实例&#xff0c;该实例在应用程序启动时创建&#xff0c;并在整个应用程序的生命周…

DBeaver添加阿里maven镜像

1、点击数据库->驱动管理器 2、选择任意数据库&#xff0c;点击编辑按钮 3、点击下载/更新(D) 4、点击下载配置 5、点击添加 6、添加阿里云地址 http://maven.aliyun.com/nexus/content/groups/public/ 7、将阿里云地址移动到首位并点击"应用并关闭"

笔记---容斥原理

AcWing,890.能被整除的数 给定一个整数 n n n 和 m m m 个不同的质数 p 1 , p 2 , … , p m p_{1},p_{2},…,p_{m} p1​,p2​,…,pm​。 请你求出 1 ∼ n 1∼n 1∼n 中能被 p 1 , p 2 , … , p m p_{1},p_{2},…,p_{m} p1​,p2​,…,pm​ 中的至少一个数整除的整数有多少…

【项目日记(八)】第三层: 页缓存的具体实现(下)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…

Android14 WMS-DisplayArea层级结构生成

每个手机可以有多个屏幕, 一个屏幕是一个displaycont, 下面从displaycont开始, 看下层级结构是如何构建的 02-02 19:55:04.258 3530 3530 V jinyanmeiWMS: java.lang.RuntimeException: jinyanmeiWMS 02-02 19:55:04.258 3530 3530 V jinyanmeiWMS: at com.android.serve…

【大数据面试题】001 Flink 的 Checkpoint 原理

一步一个脚印&#xff0c;一天一道大数据面试题。 Flink 是大数据实时处理计算框架。实时框架对检查点&#xff0c;错误恢复的功能要比离线的更复杂&#xff0c;所以一起来了解 Flink 的 Checkpoint 机制吧。 Checkpoint 机制 触发 Checkpoint 通过设置时间或数据量阈值来触…

LangChain 81 LangGraph 从入门到精通三

LangChain系列文章 LangChain 60 深入理解LangChain 表达式语言23 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 61 深入理解LangChain 表达式语言24 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 62 深入理解Lang…

低版本MATLAB打开高版本Simulink文件的方法

打开simulink&#xff0c;依次点击“建模”、“环境”、“simulink预设项”&#xff0c;如图所示&#xff1a; 然后在弹出的窗口中&#xff0c;点击“模型文件”&#xff0c;并取消勾选“不要加载用更新版本的simulink创建的模型”&#xff0c;接着点击“应用”即可。如图所示&…

EAK厚膜功率电阻成功在eVTOL大量使用

eVTOL操作的特点是更高的放电曲线&#xff0c;特别是在起飞和着陆期间。 “传统上&#xff0c;电池要么被设计成提供大量能量&#xff0c;要么被设计成高功率&#xff0c;”Cuberg创始人兼首席执行官Richard Wang说。“对于eVTOL电池来说&#xff0c;在能量和功率之间保持良好…

记一次python爬虫多线程报错问题(多线程优先级别问题)。

部分python脚本&#xff1a; def sap_logon():try:os.system(taskkill /F /IM saplogon.exe)print("SAP程序已关闭&#xff01;")except:print("SAP程序没打开&#xff01;")sap_app r"C:\\Program Files (x86)\\SAP\FrontEnd\\SAPgui\\saplogon.ex…

情人节适合送哪些礼物?2024年情人节送礼指南大推荐!

情人节即将来临&#xff0c;这是一年一度表达爱意的时刻。在这个特殊的日子里&#xff0c;送上一份精心挑选的礼物&#xff0c;将会让爱意更加深刻。但是&#xff0c;肯定会有朋友会困惑于选择哪种礼物能够最好地表达您的心意。不用担心&#xff0c;今天小编就为大家精心准备了…

Linux的7个运行级别

目录 1、有那7个运行级别&#xff1f; 2、那么如何查看运行级别呢?  3、那么我想临时切换运行级别? 4、那么我想修改配置文件中的运行级别呢? 1、有那7个运行级别&#xff1f; 0&#xff1a;停机状态。系统默认运行级别不能设置为0&#xff0c;否则系统不能正常启动&a…

JDK17中的密封类sealed和permits使用指南:什么是Java中的sealed和permits?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

FPGA项目(16)——基于FPGA的音乐演奏电路

1.设计要求 能在实验箱上&#xff0c;循环播放一段音乐。&#xff08;需要源码的直接看最后一节&#xff09; 2.设计原理 组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需要的两个基本要素&#xff0c;问题是如何来获取这两个要素所对应的数值以及通过纯硬件…