CF2152F.Triple Attack
省选/NOI-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
Zeus 正在分析战斗录像,以了解对手的攻击模式。对手有一个特殊能力:如果在 z 时间内命中同一个目标三次,他的第三次攻击就会变得非常强力。
为了避免被对手触发强化攻击,Zeus 不能让对手在 z 时间内连续命中三次。设 Y={y1,y2,…,ym} 为包含 m 个时间戳的多重集,每个 yi 代表对手攻击命中的时刻。我们称 Y 是安全的,当且仅当对任意三个时间戳 {yi,yj,yk}(1≤i<j<k≤m),都有 max(yi,yj,yk)−min(yi,yj,yk)>z,其中 z 是给定的时间窗口。
Zeus 有一个日志,记录了 n 个时间戳 x1,x2,…,xn,表示对手每次攻击命中的时间。所有时间戳按非递减顺序排列,即 xi≤xi+1 对所有 1≤i<n 成立。
Zeus 有 q 个关注的区间,每个区间为两个整数 1≤l≤r≤n。对于每个区间,Zeus 想要知道在 [xl,xl+1,…,xr] 中,最多能让多少次攻击通过,使得任何选出的集合都是安全的。
也就是说,Zeus 希望求出多重集 {xl,xl+1,…,xr} 的最大安全子集的大小。
输入格式
每个测试包含多组测试用例。第一行一个整数 t 表示测试用例数(1≤t≤20000)。接下来是每组测试用例的描述。
每组测试用例的第一行为两个整数 n 和 z(1≤n≤250000,1≤z≤109)。
第二行为 n 个整数 x1,x2,…,xn (1≤xi≤109),表示对手攻击命中的时间戳,保证 x 数组非递减。
第三行为一个整数 q(1≤q≤250000)。
接下来的 q 行,每行两个整数 l 和 r(1≤l≤r≤n),表示区间的两端。
保证所有测试用例的 n 之和不超过 250000,所有测试用例的 q 之和不超过 250000。
输出格式
对于每组测试用例的每个询问,输出一个整数,表示指定区间内所能选出的最大安全子集的大小。
输入输出样例
输入#1
3 6 10 1 5 7 8 11 12 6 1 6 1 5 2 6 1 4 2 5 3 6 6 1 1 1 1 3 3 3 2 3 3 1 6 12 15 4 5 15 24 27 32 36 39 40 46 48 48 20 1 12 1 11 6 10 1 8 8 12 11 12 2 9 3 8 7 8 7 10 4 8 9 12 9 10 2 12 1 5 3 12 4 8 3 7 7 12 10 11
输出#1
3 2 2 2 2 2 1 4 6 6 2 4 2 2 5 3 2 2 2 2 2 6 4 5 2 3 2 2
说明/提示
在第一个测试用例的第一个询问中,考虑时间戳 {1,5,7,8,11,12},z=10。子集 {1,5,12} 是安全的,因为其唯一的三元组满足 12−1=11>10。无法构造出大小为 4 的安全子集,所以本次询问的答案为 3。
在第二个测试用例的第一个询问,考虑时间戳 {1},z=1。全体集合 {1} 是安全的,因为没有任何三元组,因此答案为 1。
在第二个测试用例的第二个询问中,考虑时间戳 {1,1,1,3,3,3},z=1。
子集 S={1,1,3,3} 是安全的,因为:
- 三元组 (i,j,k)=(1,2,3),max(1,1,3)−min(1,1,3)=2>1。
- 三元组 (i,j,k)=(1,2,4),max(1,1,3)−min(1,1,3)=2>1。
- 三元组 (i,j,k)=(1,3,4),max(1,3,3)−min(1,3,3)=2>1。
- 三元组 (i,j,k)=(2,3,4),max(1,3,3)−min(1,3,3)=2>1。
无法构造大小为 5 的安全子集,所以本次询问的答案为 4。
由 ChatGPT 5 翻译
输入解题思路,AI测评打分。不知道怎么写?