#P13296. [GCJ 2013 #2] Erdős–Szekeres

    ID: 13113 远端评测题 3000ms 1024MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>图论贪心2013图论建模构造Google Code Jam

[GCJ 2013 #2] Erdős–Szekeres

Description

给定一个数列 XX,其内容为 (1,2,,N)(1, 2, \ldots, N)。一个递增子序列是指这些数字中按递增顺序出现的某个子集;递减子序列则是按递减顺序出现的子集。例如,(5,7,8)(5, 7, 8)(4,5,3,7,6,2,8,1)(4, 5, 3, 7, 6, 2, 8, 1) 的一个递增子序列。

大约 80 年前,两位数学家 Paul Erdős 和 George Szekeres 证明了一个著名结论:XX 一定存在长度至少为 N\sqrt{N} 的递增子序列,或长度至少为 N\sqrt{N} 的递减子序列。例如,(4,5,3,7,6,2,8,1)(4, 5, 3, 7, 6, 2, 8, 1) 有一个长度为 44 的递减子序列 (5,3,2,1)(5, 3, 2, 1)

我正在教授组合数学课程,想通过实例“证明”这个定理。对于序列中每个 X[i]X[i],我会计算两个值:

  • A[i]A[i]:包含 X[i]X[i] 且以 X[i]X[i] 为最大值的最长递增子序列的长度。
  • B[i]B[i]:包含 X[i]X[i] 且以 X[i]X[i] 为最大值的最长递减子序列的长度。

我的证明关键在于,对于每个 ii(A[i],B[i])(A[i], B[i]) 这对值都是不同的,这就意味着对于某个 iiA[i]A[i]B[i]B[i] 至少有一个不小于 N\sqrt{N}。对于上面的序列,所有 A[i]A[i]B[i]B[i] 的值如下表:

ii X[i]X[i] A[i]A[i] B[i]B[i]
0 4 1 4
1 5 2
2 3 1 3
3 7 3 4
4 6 3
5 2 1 2
6 8 4
7 1

我曾经设计了一个很有趣的数列来演示这个事实,并且为每个 ii 计算了 A[i]A[i]B[i]B[i],但后来却忘记了原始的数列是什么。现在,给定 A[i]A[i]B[i]B[i],你能帮我还原出 XX 吗?

XX 应该是 (1,2,,N)(1, 2, \ldots, N) 的某种排列。如果有多种可能的数列,请输出字典序最小的那一个。也就是说,X[0]X[0] 应尽量小,如果还有多种方案,则 X[1]X[1] 尽量小,依此类推。

Input Format

输入的第一行为测试用例数 TT。接下来有 TT 个测试用例,每个测试用例包含三行。

每个测试用例的第一行为一个整数 NN。第二行为 NN 个正整数,依次为 A[0],A[1],,A[N1]A[0], A[1], \dots, A[N-1]。第三行为 NN 个正整数,依次为 B[0],B[1],,B[N1]B[0], B[1], \dots, B[N-1]

Output Format

对于每个测试用例,输出一行 "Case #x: ",后接 X[0],X[1],,X[N1]X[0], X[1], \dots, X[N-1],用空格分隔。

2
1
1
1
8
1 2 1 3 3 1 4 1
4 4 3 4 3 2 2 1
Case #1: 1
Case #2: 4 5 3 7 6 2 8 1

Hint

限制条件

  • 1T301 \leq T \leq 30
  • 保证至少存在一个可行解

小数据集(9 分,测试集 1 - 可见)

  • 1N201 \leq N \leq 20

大数据集(15 分,测试集 2 - 隐藏)

  • 1N20001 \leq N \leq 2000

翻译由 ChatGPT-4.1 完成。