排序前下标存储iota
#include <numeric>
//n = 5
int a[n], aid[n];//a的id
iota(aid, aid + n, 0); //->0 1 2 3 4
...
sort(aid, aid + n, [&] (int l, int r) {
return a[l] < a[r];
});//a数组不会被排序
/*aid: 0 1 2 3 4 -> 2 0 4 1 3
a : 4 7 2 9 5 -> 2 4 5 7 9*/
对于输出操作数组很有用
/*排列b数组,并输出,要求满足ai > bi的总数为x*/
iota(aid, aid + n, 0);
sort(aid, aid + n, [&] (int l, int r){
return a[l] < a[r];
});
sort(b, b + n);
for (int i = 0; i < x; i ++ )
ans[aid[n - x + i]] = b[i];//贪心:较小匹配较小
for (int i = x; i < n; i ++ )
ans[aid[i - x]] = b[i];