CF1208D Restore Permutation

题目描述

一个整数数组 $p_{1},p_{2},\ldots,p_{n}$ 被称为排列,如果它恰好包含 $1$ 到 $n$ 的每个数字各一次。例如,以下数组是排列:$[3,1,2]$,$[1]$,$[1,2,3,4,5]$ 和 $[4,3,1,2]$。以下数组不是排列:$[2]$,$[1,1]$,$[2,3,4]$。 现在有一个长度为 $n$ 的隐藏排列。 对于每个下标 $i$,给定 $s_{i}$,其定义为所有满足 $j < i$ 且 $p_{j} < p_{i}$ 的 $p_{j}$ 之和。换句话说,$s_i$ 是在第 $i$ 个元素之前且小于第 $i$ 个元素的所有元素之和。 你的任务是还原出这个排列。

输入格式

第一行包含一个整数 $n$($1 \le n \le 2 \times 10^{5}$),表示排列的长度。 第二行包含 $n$ 个整数 $s_{1}, s_{2}, \ldots, s_{n}$($0 \le s_{i} \le \frac{n(n-1)}{2}$)。 保证数组 $s$ 对应于一个长度为 $n$ 的合法排列。

输出格式

输出 $n$ 个整数 $p_{1}, p_{2}, \ldots, p_{n}$,即还原出的排列。可以证明答案是唯一的。

说明/提示

在第一个样例中,对于每个 $i$,没有下标 $j$ 同时满足两个条件,因此 $s_i$ 总是 $0$。 在第二个样例中,对于 $i=2$,有 $j=1$ 满足条件,所以 $s_2 = p_1$。 在第三个样例中,对于 $i=2,3,4$,只有 $j=1$ 满足条件,所以 $s_2 = s_3 = s_4 = 1$。对于 $i=5$,所有 $j=1,2,3,4$ 都满足条件,所以 $s_5 = p_1 + p_2 + p_3 + p_4 = 10$。 由 ChatGPT 4.1 翻译