题目大意:有一个长度为n的排列,需要进行n次操作第i次操作需要选择一个位置j,使这个位置和这个位置后面的数都+i,问每次操作选择哪个位置可以使逆序对的数量最少
1<=n<=1e5
思路:要让逆序对的序列最少,那我们就让大数少加,让小数多加,所以我们就可以用贪心的思想,令n开始的数+1,(n-1)后面的数+2,这样第n-1个数加完一定不小于第n个数,最终得到的就是一个递增数组,逆序对的数量为0
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 2e5 + 5;
int a[N], pos[N];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
pos[a[i]] = i;//记录每个数字的位置
}
for (int i = n; i >= 1; i--)
{
printf("%d ", pos[i]);//从大到小依次输出每个数的位置
}
printf("\n");
}
return 0;
}