CF1472E Correct Placement
题目描述
Polycarp 邀请了 $n$ 位朋友一起庆祝新年。在庆祝活动中,他决定为所有朋友拍一张合影。每位朋友可以选择站立或侧躺。
每位朋友有两个属性 $h_i$(身高)和 $w_i$(宽度)。在照片上,第 $i$ 位朋友占据一个 $h_i \times w_i$ 的矩形(如果他站立)或 $w_i \times h_i$ 的矩形(如果他侧躺)。
如果第 $j$ 位朋友的矩形比第 $i$ 位朋友的矩形更矮且更窄,则第 $j$ 位朋友可以站在第 $i$ 位朋友的前面。具体来说,满足下列至少一个条件即可:
- $h_j < h_i$ 且 $w_j < w_i$(两人都站立或都侧躺);
- $w_j < h_i$ 且 $h_j < w_i$(其中一人站立,另一人侧躺)。
例如,如果 $n = 3$,$h=[3,5,3]$,$w=[4,4,3]$,那么:
- 第一位朋友可以站在第二位朋友前面:$w_1 < h_2$ 且 $h_1 < w_2$(一人站立,另一人侧躺);
- 第三位朋友可以站在第二位朋友前面:$h_3 < h_2$ 且 $w_3 < w_2$(两人都站立或都侧躺)。
其他情况下,前排的人会遮挡住后排的人。
请帮助 Polycarp,对于每个 $i$,找到任意一个 $j$,使得第 $j$ 位朋友可以站在第 $i$ 位朋友前面(即至少满足上述条件之一)。
请注意,你不需要为合影找到所有人的排列顺序。你只需要为每个朋友 $i$ 找到任意一个可以站在他前面的朋友 $j$。可以将其看作是 $n$ 个独立的子问题。
输入格式
第一行包含一个整数 $t$($1 \leq t \leq 10^4$),表示测试用例的数量。接下来是 $t$ 组测试数据。
每组测试数据的第一行包含一个整数 $n$($1 \leq n \leq 2 \times 10^5$),表示朋友的数量。
接下来的 $n$ 行,每行包含两个整数 $h_i$ 和 $w_i$($1 \leq h_i, w_i \leq 10^9$),分别表示第 $i$ 位朋友的身高和宽度。
保证所有测试用例中 $n$ 的总和不超过 $2 \times 10^5$。
输出格式
对于每个测试用例,输出 $n$ 个整数,单独占一行,第 $i$ 个数表示可以站在第 $i$ 位朋友前面的朋友的编号。如果不存在这样的朋友,则输出 $-1$。
如果有多个答案,输出任意一个即可。
说明/提示
第一个测试用例在题目描述中已经给出。
在第三个测试用例中,以下答案也是正确的:
- $[-1, -1, 1, 2]$;
- $[-1, -1, 1, 1]$;
- $[-1, -1, 2, 1]$。
由 ChatGPT 4.1 翻译