Codeforces Round 922 (Div. 2)赛后总结
A
没啥好说的,简单水题。
B
对于此题,我只能说,甘拜下风,看了题解发现逻辑上被打败了。
-
题解
从总体上看仅对ai和aj,bi和bj两组数据总的倒置数只有三种情况,0,1,2。
由于a,b是同时交换,那么变完后的数据也只可能是一一对应的2,1,0。
那么我们只需要对任何一组数据从小到大排序,那么a,b的总和情况必然只有0 ,1两种,而1情况是无法改变的。所以就可以保证两组数据此时为最小值。
-
代码实现
题解中是使用pair,但我思考了一下发现其实不用pair也能做。
这里唯一困难的点应该是sort要如何同时改变两个数的值。
不过这里可以新创个数组来解决。
- 原理
这里我们我们使用sort排序的特性,用c数组初始化为从c[i]=i.那么我们对c数组用a数组的数据排序,那么c数组的数据就是a数组排序后的下标,那么由于a数组中数据的唯一性,每个数据的值都有且唯一的下标,我们便可以用c数组储存的下标来输出b数组的数据。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <math.h>
#define ll long long
using namespace std;
int n;
int a[200010];
int b[200010];
int c[200010];//用c数组记录排序后的a数组下标
bool cmp(int x, int y) {
return a[x] < a[y];
}
int main() {
int t;
cin >> t;
for (int i = 1; i <= t; i++) {
cin >> n;
for (int j = 1; j <= n; j++) {
cin >> a[j];
c[j] = j;
}
for (int j = 1; j <= n; j++) {
cin >> b[j];
}
sort(c + 1, c + 1 + n, cmp);
sort(a + 1, a + 1 + n);
for (int j = 1; j <= n; j++) {
cout << a[j] << " ";
}
cout << endl;
for (int j = 1; j <= n; j++) {
cout << b[c[j]] << " ";//直接对应数组a中的下标来输出b数组的值
}
cout << endl;
}
}
C
看了题解后发现思路没问题,不会实现。位运算找时间学一下。