ABC 399 CD解

D题

题目陈述

思路

初见题目一眼暴力

然后写了20min

被数据范围制裁了

明显,我们需要更搞笑的算法

根据题意模拟qwq

推导判断式

AC Code

include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 10;

int a[N * 2];

vector vis[N];

int main()
{
int t;

cin>>t;

while(t--)
{
	int ans = 0;
	
	int n;
	
	cin>>n;
	
	for(int i = 1;  i <= n;  i++)
	{
		vis[i].clear();
	}//多测不清空,亲人两行泪
	
	for(int i = 1;  i <= 2 * n;  i++)
	{
		cin>>a[i];
	}
	
	for(int i = 1;  i <= 2 * n;  i++)
	{
		vis[a[i]].push_back(i);
	}
	
	for(int i = 1;  i <= n;  i++)
	{
		if(vis[i][1] - vis[i][0] == 1)
		{
			continue;
		}
		if(vis[i][0] != 1 && abs(vis[a[vis[i][0] - 1]][1] - vis[i][1]) == 1)
		{
			ans++;
		}
	}
	cout<<ans<<endl;
}

return 0;

}

AC Code分析

ff[i][0] 为整数 i 第一次出现的位置,ff[i][1] 是整数 i 第二次出现的位置

这段代码的核心在于判断是否能通过交换操作使两对夫妻坐在一起。通过检查 i 的第一次出现位置的前一个数的第二次出现位置与 i 的第二次出现位置是否相邻,能够有效地判断是否可以通过一次交换操作满足条件。因为在这种情况下,交换这两个数的位置就可以使两对夫妻坐在一起。

posted @ 2025-04-04 18:33  include_qwq  阅读(69)  评论(1)    收藏  举报