首页 > 其他分享 >洛谷P8818 [CSP-S 2022] 策略游戏

洛谷P8818 [CSP-S 2022] 策略游戏

时间:2024-10-13 12:32:16浏览次数:5  
标签:洛谷 r1 min long 100005 P8818 2022 l1 include

Problem

给出两个数组A,B,进行q次询问,每次分别给出这两个数组的某个区间l1,r1,l2,r2,也就是\(A_{l1 \sim r1}\)与\(B_{l2\sim r2}\),有两位同学小L和小Q分别从A,B的以上区间中选一个数,而两数乘积为此次操作的分数,小L希望分数大,小Q希望分数小,请问他们每次以最优策略进行游戏,分数将会是多少?(小L先选,且小Q知道小L选了什么)
其中\(1\le n,m,q\le 10^5\)

Solve

不难发现小L如果选了正数,小Q会选最小的数,反之亦然。
但是小L作为先手肯定预判了他的预判,所以他会在脑海中模拟如果选 正数max 正数min 负数max 负数min 小L会选什么,然后计算模拟的四种情况的得分,取最大的方案即可。
然后A,B数组的最值可以直接用ST表维护,对于每个ST表如果有不符合正负的元素直接变成inf或-inf即可。
时间复杂度\(O(n\log n+m\log m)\)

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdlib>
#include<list>
#include<map>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const long long INF=0x3f3f3f3f3f3f3f3f;
long long n,m,q,a[100005],b[100005];
long long m1[100005][22],m2[100005][22],m3[100005][22],m4[100005][22];//正max/min 负max/min
long long m5[100005][22],m6[100005][22],lg[100005];//max/min
void init(){
    for(int i=1;i<=n;i++)m2[i][0]=INF,m3[i][0]=-INF,m4[i][0]=INF;
    for(int i=1;i<=m;i++)m5[i][0]=-INF,m6[i][0]=INF;
    for(int i=2;i<=max(n,m);i++){
        lg[i]=lg[i/2]+1;
    }
}
long long pow(long long x){
    return 1<<x;
}
long long qlr(int l,int r,int type){
    if(type==1)return max(m1[l][lg[r-l+1]],m1[r-pow(lg[r-l+1])+1][lg[r-l+1]]);
    if(type==2)return min(m2[l][lg[r-l+1]],m2[r-pow(lg[r-l+1])+1][lg[r-l+1]]);
    if(type==3)return max(m3[l][lg[r-l+1]],m3[r-pow(lg[r-l+1])+1][lg[r-l+1]]);
    if(type==4)return min(m4[l][lg[r-l+1]],m4[r-pow(lg[r-l+1])+1][lg[r-l+1]]);
    if(type==5)return max(m5[l][lg[r-l+1]],m5[r-pow(lg[r-l+1])+1][lg[r-l+1]]);
    if(type==6)return min(m6[l][lg[r-l+1]],m6[r-pow(lg[r-l+1])+1][lg[r-l+1]]);
}
int main(){
    cin>>n>>m>>q;
    init();
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]>0){
            m1[i][0]=a[i];
            m2[i][0]=a[i];
        }else {
            m3[i][0]=a[i];
            m4[i][0]=a[i];
        }
    }
    for(int i=1;i<=m;i++){
        cin>>b[i];
        m5[i][0]=b[i];
        m6[i][0]=b[i];
    }
    for(int j=1;j<=lg[n];j++){
        for(int i=1;i<=n;i++){
            if(i+pow(j)-1>n)break;
            m1[i][j]=max(m1[i][j-1],m1[i+pow(j-1)][j-1]);
            m3[i][j]=max(m3[i][j-1],m3[i+pow(j-1)][j-1]);
            m2[i][j]=min(m2[i][j-1],m2[i+pow(j-1)][j-1]);
            m4[i][j]=min(m4[i][j-1],m4[i+pow(j-1)][j-1]);
        }
    }
    for(int j=1;j<=lg[m];j++){
        for(int i=1;i<=m;i++){
            if(i+pow(j)-1>m)break;
            m5[i][j]=max(m5[i][j-1],m5[i+pow(j-1)][j-1]);
            m6[i][j]=min(m6[i][j-1],m6[i+pow(j-1)][j-1]);
        }
    }
    while(q--){
        long long l1,r1,l2,r2,t1=-INF,t2=-INF,t3=-INF,t4=-INF;
        cin>>l1>>r1>>l2>>r2;
        if(qlr(l1,r1,1)>0){
            t1=qlr(l1,r1,1)*qlr(l2,r2,6);
            t2=qlr(l1,r1,2)*qlr(l2,r2,6);
        }
        if(qlr(l1,r1,4)<=0){
            t3=qlr(l1,r1,3)*qlr(l2,r2,5);
            t4=qlr(l1,r1,4)*qlr(l2,r2,5);
        }
        cout<<max(max(t1,t2),max(t3,t4))<<endl;
    }
    return 0;
}

标签:洛谷,r1,min,long,100005,P8818,2022,l1,include
From: https://www.cnblogs.com/yiweixxs/p/18462147

相关文章

  • 信息学奥赛复赛复习16-CSP-J2022-01乘方-循环特判、pow函数、快速幂
    PDF文档公众号回复关键字:20241012此前解析题,P8813[CSP-J2022]乘方,给出了循环的解题思路,当时在洛谷提交是通过的,后台收到留言,a=1,b=1e9会炸吧?,确实啊整除要求1s内循环次数最大可以到10^7,现在测试数据明显大很多,按测试数据有这个可能,没想到CSP普及组第1题竟然翻车,去CCF官网......
  • 洛谷P1102 A-B数对
    A-B数对题目背景出题是一件痛苦的事情!相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的A+BProblem,改用A-B了哈哈!题目描述给出一串正整数数列以及一个正整数\(C\),要求计算出所有满足\(A-B=C\)的数对的个数(不同位置的数字一样的数对算不同的数对)。输入格......
  • 2011-2022年各省金融监管水平数据(含原始数据+计算过程+计算代码)
    2011-2022年各省金融监管水平数据(含原始数据+计算过程+计算代码)1、时间:2011-2022年2、来源:国家统计局、统计年鉴3、指标:金融业增加值、金融监管支出、金融监管水平4、计算方法:金融监管水平=金融监管支出/金融业增加值5、指标解释:金融监管水平是指政府及其指定机构通过法......
  • 学年2022-2024-1学号20241311《计算机基础与程序设计》第3周学习总结
    学期(2024-2025-1)学号(20241311)《计算机基础与程序设计》第3周学习总结作业信息这个作业属于哪个课程<班级的链接>(2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里<作业要求的链接>((https://edu.cnblo......
  • The 2022 ICPC Asia Hangzhou Regional Programming Contest K. Master of Both
    题目链接题意:给定n个字符串,然后给定q种字典序规则,在这q种字典序规则下求出这n个字符串的逆序对数量。思路:我们发现q很大,对于每一种排序规则都遍历一遍n个字符串去求逆序对的数量复杂度太高,所以考虑预处理。我们知道要判断两个字符串字典序的大小关系,只需要知道它们第......
  • VS2019/2022配置C++ OpenCV4.10.0环境
    一、下载opencv4.10.0官网链接:https://opencv.org/ 安装的时候记住安装路径,本人安装到E盘 二、新建C++项目1、本人新建C++/CLR.Netframework项目 2、右击打开C++项目属性2.1、添加包含目录 此处本人配置的是绝对地址,拷贝build文件夹到程序目录,然后配置相对地......
  • 20222316 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    一、实验内容缓冲区溢出定义:缓冲区溢出是一种程序错误,在这种情况下,数据被写入到内存中的缓冲区时超过了该缓冲区所能容纳的最大容量。当超过缓冲区的边界时,额外的数据会溢出到相邻的内存位置中,覆盖掉其他数据或指令,导致程序行为异常或系统安全漏洞。缓冲区溢出的原因:编程......
  • 20222311 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    202223112024-2025-1《网络与系统攻防技术》实验一实验报告1.实验内容本次实验主要内容为BOF注入攻击,任务如下:掌握反汇编及其指令修改程序的机器指令,从而实现BOF注入攻击注入一段Shellcode,以实现BOF注入攻击2.实验过程任务1:修改可执行文件机器指令,改变程......
  • # 20222409 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容1.1逆向工程与汇编基础:掌握了汇编指令(如NOP、JMP等)在控制程序流中的作用。学会使用objdump反汇编可执行文件,并通过十六进制编辑器修改机器码以改变程序执行流程。1.2缓冲区溢出(BufferOverflow)原理:了解堆栈结构和返回地址覆盖,理解如何通过超长输入覆盖返回地址来控......
  • 20222318 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    一.实验内容(一)本周学习内容本周学习了缓冲区溢出的相关原理,包括简单的汇编代码、缓冲区溢出本质、堆栈的工作原理、Shellcode的编写等等。(二)实验涉及知识点(1)Linux基本操作:①熟悉Linux环境:能够在Linux系统中进行基本的文件操作、目录导航,如cd等。②常用指令理解:如管道(|)、输入......