mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-10-26 10:02:47 +00:00
feat: 添加P7299.cpp解决奶牛位置交换问题
实现奶牛位置交换问题的解决方案,包括位置跟踪和并查集操作来计算最终位置。通过输入处理、位置交换记录和结果计算,输出每头奶牛的最终位置访问次数。
This commit is contained in:
parent
65e1874d65
commit
f663a7e270
57
src/10/21/P7299.cpp
Normal file
57
src/10/21/P7299.cpp
Normal 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";
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user