diff --git a/src/10/21/P7299.cpp b/src/10/21/P7299.cpp new file mode 100644 index 0000000..57926d3 --- /dev/null +++ b/src/10/21/P7299.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include +using ll = int64_t; + +std::vector> gotopos; +std::vector endpos; +ll n,k; +std::vector poscow,nposcow; +std::vector> vispos; +std::vector 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<