How ABC G
  • 板块学术版
  • 楼主chlchl
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/5/20 21:45
  • 上次更新2023/10/23 15:12:07
查看原帖
How ABC G
363036
chlchl楼主2023/5/20 21:45

我的想法是预处理一个 cnti,jcnt_{i,j} 表示占着 ii 最终位置的 jj 的个数(1≤i,j≤41\le i,j\le 4),然后对这个数组进行计算。

但是我不知道接下来怎么搞,请大佬提供思路,下面是代码半成品:

#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
int n, a[N], b[N];
int cnt[6][6]; 

int main(){
	scanf("%d", &n);
	for(int i=1;i<=n;i++){
		scanf("%d", &a[i]);
		b[i] = a[i];
	}
	sort(b + 1, b + 1 + n);
	for(int i=1;i<=n;i++)
		cnt[b[i]][a[i]]++;//cnt[i][j] 表示占着 i 最终位置的 j 的个数
	int ans = 0;
	for(int i=1;i<=3;i++){
		for(int j=i+1;j<=4;j++){
			int d = min(cnt[i][j], cnt[j][i]);
			ans += d;
			cnt[i][j] -= d, cnt[j][i] -= d;
		}
	}
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++){
			if(i == j)
				continue;
			ans += cnt[i][j];
		}
	}
	printf("%d\n", ans - 1);
	return 0;
}
2023/5/20 21:45
加载中...