fix(P7299): 修正牛位置交换逻辑和结果计算方式

修复牛位置交换时的gotopos更新逻辑,将结果存储从vector<ll>改为vector<set<ll>>以正确计算最终位置集合大小
This commit is contained in:
Zengtudor 2025-10-21 15:11:53 +08:00
parent f663a7e270
commit 47b4928966

View File

@ -1,4 +1,5 @@
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <set>
@ -11,7 +12,8 @@ std::vector<ll> endpos;
ll n,k;
std::vector<ll> poscow,nposcow;
std::vector<std::set<ll>> vispos;
std::vector<ll> bcj,ans;
std::vector<ll> bcj;
std::vector<std::set<ll>> ans;
static inline ll find(ll idx){
if(idx==bcj[idx])return idx;
return bcj[idx]=find(bcj[idx]);
@ -27,7 +29,9 @@ int main(){
std::cin>>n>>k;
poscow.resize(n+1);
gotopos.resize(n+1);
vispos.resize(n+1);
endpos.resize(n+1);
bcj.resize(n+1);
for(ll i=1;i<=n;i++)bcj[i]=i;
ans.resize(n+1);
@ -36,22 +40,23 @@ int main(){
for(ll i=1;i<=k;i++){
ll a,b;
std::cin>>a>>b;
gotopos[poscow[a]].emplace(b);
gotopos[poscow[b]].emplace(a);
std::swap(poscow[a],poscow[b]);
gotopos[poscow[a]].emplace(a);
gotopos[poscow[b]].emplace(b);
}
for(ll i=1;i<=n;i++){
endpos[poscow[i]]=i;
gotopos[i].erase(gotopos[i].find(endpos[i]));
}
for(ll i=1;i<=n;i++)poscow[i]=i;
for(ll i=1;i<=n;i++){
merge(i, endpos[i]);
if(gotopos[i].size())gotopos[i].erase(gotopos[i].find(endpos[i]));
}
for(ll i=1;i<=n;i++){
ans[find(i)]+=1+gotopos[i].size();
ans[find(i)].emplace(i);
ans[find(i)].insert(gotopos[i].cbegin(),gotopos[i].cend());
}
for(ll i=1;i<=n;i++){
std::cout<<ans[i]<<"\n";
std::cout<<ans[find(i)].size()<<"\n";
}
}