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
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 的第二次出现位置是否相邻,能够有效地判断是否可以通过一次交换操作满足条件。因为在这种情况下,交换这两个数的位置就可以使两对夫妻坐在一起。

浙公网安备 33010602011771号