当日总结

牛客 小红的不动点分配
小红拿到了
2
×
n
2×n 个元素,现在她想将这些元素划分为两组(每组恰好
n
n 个元素),且两组内部的顺序均可任意重排。
她想知道,这两个数组的不动点数量之和最多是多少,请你帮帮她。

【名词解释】
不动点:定义整数
i
(
1

i

m
)
i(1≦i≦m) 是长度为
m
m 的数组
{
a
1
,
a
2
,

,
a
m
}
{a
1

,a
2

,…,a
m

} 的一个不动点,当且仅当满足
a
i

i
a
i

=i。
输入描述:
第一行输入一个整数
n
(
1

n

2
×
1
0
5
)
n(1≦n≦2×10
5
)。
第二行输入
2
×
n
2×n 个正整数
a1,a2,…,a2×n(1≦ai≦2×105)a 1,a 2 ,…,a 2×n (1≦a i≦2×10 5 ),代表数组中的元素。
输出描述:
输出一个整数,代表两个数组的不动点数量之和的最大值。

代码

include

include

include<unordered_map>

using namespace std;
using ll=long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
ll n;
cin>>n;
vectornum(2n);
unordered_map<ll,int>cnt_mp;
for(ll i=0;i<2
n;i++)
{
cin>>num[i];
cnt_mp[num[i]]++;
}
ll cnt=0;
for(ll i=1;i<=n;i++)
{
if(cnt_mp[i]==1)cnt++;
else if(cnt_mp[i]>=2)cnt+=2;
}
cout<<cnt<<endl;
}

posted @ 2026-03-25 21:56  lagranSun  阅读(2)  评论(0)    收藏  举报