mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-10-26 10:02:47 +00:00
fix(P7299): 修正牛位置交换逻辑和结果计算方式
修复牛位置交换时的gotopos更新逻辑,将结果存储从vector<ll>改为vector<set<ll>>以正确计算最终位置集合大小
This commit is contained in:
parent
f663a7e270
commit
47b4928966
@ -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";
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user