这份代码有什么问题#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn = 1e5 + 10; const int mm = 1e8 + 10; int a1[maxn], b1[maxn], a2[maxn], b2[maxn], s[mm]; int t, n, k; int main() { cin >> t; while (t--) { memset(s, -1, sizeof(s)); cin >> n >> k; for (int i = 0; i < n; ++i) { cin >> a1[i]; a2[i] = a1[i]; } for (int j = 0; j < n; ++j) { cin >> b1[j]; b2[j] = b1[j]; } sort(a1, a1 + n); for (int i = 0; i < n; ++i) s[a1[i]] = i; sort(b1, b1 + n); for (int i = 0; i < n; ++i) cout << b1[s[a2[i]]] << " "; cout << endl; } return 0; }
时间: 2023-07-30 22:10:37 浏览: 41
这份代码的问题在于数组 `s` 的大小是 `mm`,也就是 $10^8+10$,而在循环中最多只会将 $n$ 个数存入该数组,因此造成了数组的浪费。另外,在第二个排序之后,变量 `i` 没有被重置,可能会影响程序的正确性。建议将数组 `s` 的大小改为 $maxn$,并在第二个排序前将变量 `i` 重置为0。修改后的代码如下:
```
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1e5 + 10;
int a1[maxn], b1[maxn], a2[maxn], b2[maxn], s[maxn];
int t, n, k;
int main() {
cin >> t;
while (t--) {
memset(s, -1, sizeof(s));
cin >> n >> k;
for (int i = 0; i < n; ++i) {
cin >> a1[i];
a2[i] = a1[i];
}
for (int j = 0; j < n; ++j) {
cin >> b1[j];
b2[j] = b1[j];
}
sort(a1, a1 + n);
for (int i = 0; i < n; ++i) s[a1[i]] = i;
sort(b1, b1 + n);
for (int i = 0; i < n; ++i) {
cout << b1[s[a2[i]]] << " ";
}
cout << endl;
}
return 0;
}
```