专栏文章

题解:AT_abc399_d [ABC399D] Switch Seats

AT_abc399_d题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miprs217
此快照首次捕获于
2025/12/03 16:53
3 个月前
此快照最后确认于
2025/12/03 16:53
3 个月前
查看原文

正文开始

阅读理解:

2n2n 个数,其中 1n1\sim n 搞好出现 22 次。现在求有多少对数本不相邻,但一个数和另外一对数中一个交换后,两队数都相邻。

思路:

令一对数为 xx,另一对为 yy
很显然,想要交换后都相邻,那就必须 xxyy 分别相邻,于是就可以存下每个数第一次出现的位置,然后看 lail_{a_i}lai1l_{a_{i-1}} 是否相邻即可。
注:如 lail_{a_i}ii 相邻,或 lai1l_{a_{i-1}}ii 相邻时也不合法。

代码实现:

CPP
#include<bits/stdc++.h>
using namespace std;
int T;
int n;
int a[400005],t[400005],ans;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=1;i<=2*n;i++){
			cin>>a[i];
			if(!t[a[i]])t[a[i]]=i;//存第一次出现的位置。 
		}
		for(int i=2;i<=2*n;i++){
			int x=t[a[i]],y=t[a[i-1]];//a[i] 第一次出现的位置与 a[i-1] 第一次出现的位置。 
			if(abs(i-x)<=1||abs(i-1-y)<=1||abs(x-y)!=1)continue;//如果相邻,或者 x 与 y 不相邻,那就不合法。 
			ans++;
		}
		cout<<ans<<'\n';
		for(int i=1;i<=2*n;i++)t[a[i]]=0;
		ans=0;
		//多测不清空,爆 0 两行泪 
	}	
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...