逆序数还原
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
有一段时间Eric对逆序数充满了兴趣,于是他开始求解许多数列的逆序数
(对于由1...n构成的一种排列数组a,逆序数即为满足i<j,ai>aj的数字对数),
但是某天他发现自己遗失了原来的数列,只留下之前计算过程中留下的各个
数字对应的逆序数,现在请你帮他还原出原序列。
思路:
这道题看起来很复杂,但是却是有规律的,就拿样例来说吧,输入的第一个数是2,那么就说明后面只有2个数比它小,那么肯定就是3了,然后在原来的数组中把3标记去掉,然后第二个是0,那么后面都比它大,那么肯定就是1了,第三个是1,那么后面有1个数比现在的这个数小,那么就取的是4,然后依此类推。
代码:
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- using namespace std;
- int main()
- {
- int n,i,j,k;
- int a[1111],b[1111];
-
- while(~scanf("%d", &n)) {
-
- memset(a, 0, sizeof(a));
- memset(b, 0, sizeof(b));
-
- for(i = 0; i < n; i++)
- b[i] = i+1;
-
- for(i = 0; i < n; i++)
- cin >> a[i];
-
- for(i = 0; i < n; i++) {
- sort(b, b+n);
- if(i != n-1) {
- printf("%d ",b[ a[i] ]);
- b[ a[i] ]=n+1;
- }
- else printf("%d\n",b[ a[i] ]);
- }
- }
- return 0;
- }