CSP-S T2 策略游戏题解

该博客主要介绍了CSP-S T2策略游戏的解题方法,包括使用RMQ(Range Minimum Query)进行分类讨论和优化。作者强调了如何简洁地实现RMQ,通过预处理和位运算提高效率,最后实现了AC并在1.05s内完成,时间复杂度为O(nlogn+q)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题的题意题目已经说得很清楚了。

大致思路

LLL 和小 QQQ 的决策肯定是在他们可选数字范围内的负数的最小值,负数的最大值,000,正数的最小值,正数的最大值中选取。

因为每个人都想达到自己的目标——最大(小)值,那么,他们如果不选最值,而选次最值,就会离最终的答案远一步。而 000 ,是为了在自己走投无路的时候可以使用。(000 * 任何数 = 000

又因为,小 LLL 手,他要取最 值,小 QQQ 后手,他要取最 值。于是我们就可以想到数学老师教给我们的 分类讨论

接着,既然要用到最值,且无修改,那么我们就可以用 RMQRMQRMQ 来维护了。

细节

一、RMQRMQRMQ

考后,我发现许多人的代码都写的好长好长( 100100100 - 200200200 行),但是,你何必让自己的手这么累呢?

我们可以 打个包

先说说 RMQRMQRMQ 我是怎么定义的吧。

第一维,用于区分 AAABBB 数组。

第二维,用于区分当前数组的正数 maxmaxmax,正数 minminmin,负数 maxmaxmax,负数 minminmin

首先,我们要建立 RMQRMQRMQ。按照输入 AAABBB 数组的正负来讨论。

  • 若为正,更新正数 maxmaxmax 和正数 minminmin,负数 maxmaxmax 置为最大值,负数 minminmin 置为最小值。
  • 若为负,更新负数 maxmaxmax 和负数 minminmin,正数 maxmaxmax 置为最小值,负数 minminmin 置为最大值。
//A——0,B——1 
//  1         2         3         4
//  正数max  正数min   负数max   负数min
void build(int id, int x, int f) {
   
	if (x >= 0) RMQ[f][1][id][0] = RMQ[f][2][id][0] = x, RMQ[f][3][id][0] = -INF, RMQ[f][4][id][0] = INF;
	else RMQ[f][3][id][0] = RMQ[f][4][id][0] = x, RMQ[f][1][id][0] = -INF, RMQ[f][2][id][0] = INF;
}

接着,我们需要预处理出 RMQRMQRMQ

观察我的 RMQRMQRMQ 的定义,发现若第二维为奇数,则为 maxmaxmax,为 偶数偶数偶数,则为 minminmin

于是有了我们的 updateupdateupd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值