两个序列按序离散化

da_AA

2018-06-01 20:32:01

Personal

## 问题 考虑这样一个问题:有两个序列,例如: > 3 6 7 4 8 > 5 2 3 6 7 将第二个序列变成按第一个序列的顺序排列,即: > 2 5 6 3 7 如果看下标,则序列二变为: > 2 1 4 3 5 求这个数组。 ## 算法 将序列A, B中每个数“绑定”其下标: ```c++ struct num { int val, idx; }; num A[N], B[N]; ``` | A | B | | :----------: | :----------: | | (3,1) | (5,1) | | (6,2) | (2,2) | | (7,3) | (3,3) | | (4,4) | (6,4) | | (8,5) | (7,5) | 将A, B序列分别按值排序: | A | B | | :----------: | :----------: | | (3,1) | (2,2) | | (4,4) | (3,3) | | (6,2) | (5,1) | | (7,3) | (6,4) | | (8,5) | (7,5) | 现在,两个数组就有序了,而$A[1].idx$为1,$B[1].idx$为2,所以,A数组的一号位对应着B数组的二号位,同理,A数组的四号位对应着B数组的三号位,A数组的二号位对应着B数组的一号位…… 所以: ```cpp c[a[i].idx] = b[i].idx; ``` c数组即为所求。