C. New Year Ratings Change

来源:互联网 发布:番禺网络推广 编辑:程序博客网 时间:2024/06/06 06:47

time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

One very well-known internet resource site (let's call it X) has come up with a New Year adventure. Specifically, they decided to give ratings to all visitors.

There are n users on the site, for each user we know the rating value he wants to get as a New Year Present. We know that user iwants to get at least ai rating units as a present.

The X site is administered by very creative and thrifty people. On the one hand, they want to give distinct ratings and on the other hand, the total sum of the ratings in the present must be as small as possible.

Help site X cope with the challenging task of rating distribution. Find the optimal distribution.

Input

The first line contains integer n (1 ≤ n ≤ 3·105) — the number of users on the site. The next line contains integer sequencea1, a2, ..., an (1 ≤ ai ≤ 109).

Output

Print a sequence of integers b1, b2, ..., bn. Number bi means that user i gets bi of rating as a present. The printed sequence must meet the problem conditions.

If there are multiple optimal solutions, print any of them.

Sample test(s)
input
35 1 1
output
5 1 2
input
11000000000
output
1000000000

解题说明:题目的意思是给定一列数得到新的一列数,新的这列数中每个数字都不同并且都不小于原数列对应位置上的每个数字。做法是采用贪心思想,先对原数列按照从小到大的位置进行排序,并且记录下原来的位置,然后确保新的数列中对应位置上的数为原数列当前数字和未使用过的1-n这些数中最小数字的最大值。

#include<iostream>#include<cstdio>#include<cmath>#include<cstdlib>#include <algorithm>using namespace std;int n, i, now, a[310000], tx[310000], ans[310000];bool cmp(int x, int y) {return a[x] < a[y];}int main() {scanf("%d", &n);for (i = 1; i <=n; i++){scanf("%d", &a[i]);tx[i] = i;}sort(tx + 1, tx + n + 1, cmp);for (i = 1; i <= n; i++) {now = max(now + 1, a[tx[i]]);ans[tx[i]] = now;}for (i = 1; i <= n; i++){printf("%d ", ans[i]);}printf("\n");return 0;}


0 0
原创粉丝点击