专栏文章

题解:AT_abc399_d [ABC399D] Switch Seats

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

文章操作

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

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

解法

显然的,本题中每个数出现且仅出现两次,于是在排除了同一个数字相邻情况之后,只需统计满足两次出现且都相邻的数对 (i,j)(i,j) 的个数。
所以此题我们只需要从后往前扫,判断出现次数大于等于二的 (i,j)(i,j) 即可。
但特别的,会有 1221 和 121……2 两种特殊情况,需要注意。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=4e5+10;
int a[N];
map<pair<int,int>,int>mp;
signed main()
{
	int T,n;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		int ans=0;
		n=n*2;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		int lx,ly;
		lx=ly=0;
		for(int i=2;i<=n;i++)
		{
			if(a[i]==a[i-1])
				continue;
			int x=a[i];
			int y=a[i-1];
			if(x<y)
			 swap(x,y);
			if(x==lx&&y==ly)
			{
				lx=ly=0;
				continue;
			}
			lx=x;
			ly=y;
			mp[make_pair(x,y)]++;
			if(mp[make_pair(x,y)]==2)
				ans++;
		}
		cout<<ans<<endl;
		for(int i=2;i<=n;i++)
		{
			int x=a[i];
			int y=a[i-1];
			if(x<y)
			swap(x,y);
			mp[make_pair(x,y)]=0;
		}
	}
	return 0;
}

评论

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

正在加载评论...