Solution
听老师说是一道经典贪心。(当然我是不会的)
你可以发现,对于每个数,它的值与它的下标之和是不变的。那么要保证单调不下降,一定要保证和是单调递增的。可以把它们加起来再排个序。
那么不合法就只有两种情况:
- 相邻两数新值相等。
- 新值减去下标小于 0 0 0。
Code
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 2e5 + 5;
int n, a[N];
int read() {
int x = 0, f = 1; char s;
while((s = getchar()) > '9' || s < '0') if(s == '-') f = -1;
while(s >= '0' && s <= '9') x = (x << 1) + (x << 3) + (s ^ 48), s = getchar();
return x * f;
}
int main() {
n = read();
for(int i = 1; i <= n; ++ i) a[i] = read() + i;
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; ++ i)
if(a[i] - i < 0 || a[i] == a[i + 1]) return puts(":("), 0;
for(int i = 1; i <= n; ++ i) printf("%d ", a[i] - i);
puts("");
return 0;
}