CF2005E2.Subtangle Game (Hard Version)

省选/NOI-

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

这是该问题的困难版本。两种版本的区别在于所有变量的约束条件。只有当你同时解决了两个版本的问题时,才能进行 Hack。

Tsovak 和 Narek 正在玩一个游戏。他们有一个整数数组 aa 和一个 nn 行 mm 列的整数矩阵 bb,行和列编号均从 11 开始。矩阵中第 ii 行第 jj 列的单元格记作 (i,j)(i, j)。

他们轮流在矩阵中寻找 aa 的元素;Tsovak 先手。每次轮到某个玩家时,他需要在矩阵中找到当前 aa 的元素(Tsovak 先找第一个,Narek 找第二个,依此类推)。假设某位玩家选择了单元格 (r,c)(r, c)。那么下一个玩家必须在以 (r+1,c+1)(r+1, c+1) 为左上角、(n,m)(n, m) 为右下角的子矩阵中选择他的单元格(如果 r=nr=n 或 c=mc=m,则子矩阵可能为空)。如果某位玩家无法在该子矩阵中找到所需的元素(或剩余子矩阵为空),或者数组已经结束(前一位玩家已经选择了最后一个元素),那么他就输了。

你的任务是判断如果两位玩家都采取最优策略,谁会获胜。

注意:由于输入数据较大,你可能需要优化输入输出。

例如,在 C++ 中,只需在 main() 函数开头加上如下代码即可:

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
}

输入格式

第一行包含一个整数 tt(1≤t≤15001 \le t \le 1500),表示测试用例的数量。

每个测试用例的第一行包含三个整数 ll、nn 和 mm(1≤l,n,m≤15001 \le l, n, m \le 1500),分别表示数组的长度和矩阵的行数、列数。

第二行包含 ll 个整数 a1,a2,a3,…,ala_1, a_2, a_3, \ldots, a_l(1≤ai≤n⋅m1 \le a_i \le n \cdot m),表示数组 aa 的元素。

接下来 nn 行,每行包含 mm 个整数 bi,1,bi,2,bi,3,…,bi,mb_{i,1}, b_{i,2}, b_{i,3}, \ldots, b_{i,m}(1≤bi,j≤n⋅m1 \le b_{i,j} \le n \cdot m),表示矩阵的第 ii 行。

保证所有测试用例中 n⋅mn \cdot m 的总和不超过 3×1063 \times 10^6。

保证所有测试用例中 ll 的总和不超过 15001500。

输出格式

你需要输出 tt 行,第 ii 行输出一个字符,表示第 ii 个测试用例的答案:如果 Tsovak 获胜则输出 "T",否则输出 "N"(不带引号)。

输入输出样例

  • 输入#1

    3
    2 2 3
    1 2
    1 3 6
    4 6 2
    2 2 4
    1 2
    1 1 3 2
    4 2 5 1
    2 4 2
    1 2
    3 4
    5 6
    7 8
    8 8

    输出#1

    N
    T
    N

说明/提示

在第一个样例中,Tsovak 首先寻找 11。只有一个 11 出现在 (1,1)(1,1),所以他选择它。然后 Narek 需要在子矩阵 (2,2)(2,2) 开始的区域中寻找 22,该区域只包含最后两个元素:66 和 22。他选择 22,此时数组已结束,Tsovak 输了。

在第二个样例中,Tsovak 需要选择 11。在单元格 (n,m)(n,m) 处有一个 11,他选择该单元格。此时子矩阵 (n+1,m+1)(n+1, m+1) 为空,Narek 无法找到 22,因此他输了。

由 ChatGPT 4.1 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页