5067.地牢谜题:更高还是更低

时间限制:16s 内存限制:512MB

在地牢谜题游戏 更高还是更低 中,初始有 $n$ 只血量不同烈焰人排列成一列,第 $i$ 只烈焰人是所有烈焰人中血量第 $p_i$ 小的。你需要按血量从低到高或从高到低的顺序(由谜题规则确定)击杀所有的烈焰人。

你有一把魔法弓,每次射击可以击杀不超过 $k$ 只相邻的烈焰人,你可以自由决定在同一次射击中烈焰人死亡的顺序。两只烈焰人是相邻的当且仅当它们之间的烈焰人都已经死亡。

你和你的同伴需要完成该地牢谜题 $m$ 次。作为一个队伍,你自然不需要独自解决谜题。在第 $i$ 次进行谜题游戏时,你的任务是击杀血量第 $l_i$ 小,第 $l_i+1$ 小,...,第 $r_i$ 小的烈焰人。 这意味着,在你开始任务之前,若谜题规则是按照血量从低到高击杀烈焰人,则血量第 $1,2,⋯,l_i −1$ 小的烈焰人已经全部被队友击杀;若谜题规则是按照血量从高到低击杀烈焰人,则血量第 $r_i+1,r_i+2,⋯,n$ 小的烈焰人已经全部被队友击杀。

同时,你可以超额完成任务。例如,若谜题规则是按血量从低到高击杀烈焰人,且你的任务是击杀血量第 $3$ 小和第 $4$ 小的烈焰人,那么,击杀血量第 $3,4$ 小 或 击杀血量第 $3,4,5$ 小的烈焰人都被视为完成任务,而 击杀血量第 $3,5$ 和 击杀血量第 $3,4,6$ 的烈焰人 被视为任务失败。

你惊奇地发现,每次谜题游戏中,烈焰人的血量关系 $p$ 是固定的,区别在于谜题规则和需要击杀的烈焰人范围不同。请你对于每次地牢谜题,计算完成任务所需的最小射击数。

输入格式(从终端/标准输入读取)

输入包含多组测试数据。

第一行包含一个整数 $T (1≤T≤10)$,表示数测试数据的组数。

对于每组测试数据,

第一行包含两个整数 $n,k (1≤k≤n≤2×10^5 )$,表示烈焰人的数量和魔法弓每次击杀烈焰人的最大数量。

第二行包含 $n$ 个整数 $p_1,p_2,…,p_n (1≤p_i ≤n)$,表示烈焰人血量大小关系。保证 $p$ 是一个排列。

第三行包含一个整数 $m (2≤m≤2×10^5 )$,表示需要完成谜题的次数。

接下来 $m$ 行,第 $i$ 行包含两个整数与一个字符 $l_i , r_i ,c_i (1≤l_i≤r_i≤n,c_i∈H,L)$,表示在第 $i$ 次谜题游戏中,你需要击杀的烈焰人范围,以及谜题规则。其中, $c_i =H$ 表示你需要按血量从低到高击杀烈焰人;

输出格式(输出至终端/标准输出)

对于每组测试数据,输出 $m$ 行,第 $i$ 行包含一个整数,表示在第 $i$ 次谜题游戏中,完成任务所需的最小射击数。

输入样例

复制
2
5 3
1 4 5 3 2
2
1 3 H
3 4 L
5 4
1 2 5 3 4
2
1 4 H
1 4 L
 \n
 · \n
 · · · · \n
 \n
 · · \n
 · · \n
 · \n
 · · · · \n
 \n
 · · \n
 · · \n

输出样例

复制
2
1
2
1
 \n
 \n
 \n
 \n
来源: 2024“钉耙编程”中国大学生算法设计超级联赛(9)

提交题解

Please login first.

© 2025 FAQs