feat: 添加P7299.cpp解决奶牛位置交换问题

实现奶牛位置交换问题的解决方案,包括位置跟踪和并查集操作来计算最终位置。通过输入处理、位置交换记录和结果计算,输出每头奶牛的最终位置访问次数。
This commit is contained in:
Zengtudor 2025-10-21 14:22:11 +08:00
parent 65e1874d65
commit f663a7e270

57
src/10/21/P7299.cpp Normal file
View File

@ -0,0 +1,57 @@
#include <cstdint>
#include <iostream>
#include <istream>
#include <set>
#include <utility>
#include <vector>
using ll = int64_t;
std::vector<std::set<ll>> gotopos;
std::vector<ll> endpos;
ll n,k;
std::vector<ll> poscow,nposcow;
std::vector<std::set<ll>> vispos;
std::vector<ll> bcj,ans;
static inline ll find(ll idx){
if(idx==bcj[idx])return idx;
return bcj[idx]=find(bcj[idx]);
}
static inline void merge(ll a,ll b){
bcj[find(a)]=find(b);
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>k;
poscow.resize(n+1);
vispos.resize(n+1);
bcj.resize(n+1);
for(ll i=1;i<=n;i++)bcj[i]=i;
ans.resize(n+1);
for(ll i=1;i<=n;i++)poscow[i]=i;
for(ll i=1;i<=k;i++){
ll a,b;
std::cin>>a>>b;
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]);
}
for(ll i=1;i<=n;i++){
ans[find(i)]+=1+gotopos[i].size();
}
for(ll i=1;i<=n;i++){
std::cout<<ans[i]<<"\n";
}
}