Codeforces Round 922 (Div. 2)赛后总结

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

看了题解后发现思路没问题,不会实现。位运算找时间学一下。

posted @ 2024-02-02 00:25  拍手称快  阅读(16)  评论(0编辑  收藏  举报