ARC107——C - Shuffle Permutation
生活随笔
收集整理的這篇文章主要介紹了
ARC107——C - Shuffle Permutation
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C - Shuffle Permutation
這幾天遇到了很多(2道)并查集維護連通關系的題。
此題把能夠相互交換的行或者列用并查集維護,不難發現一個連通塊內的點個數時cntcntcnt連通塊內的行或者列可以兩兩交換,那么對答案的貢獻是cnt!cnt!cnt!因此預處理,然后用并查集維護連通關系即可。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=60; const int mod=998244353; int g[N][N]; int n,m; int p[2*N],sz[2*N]; int find(int x) {return x==p[x]?x:p[x]=find(p[x]);} int fact[2*N]; void merge(int x,int y) {int px=find(x),py=find(y);if(px==py) return;p[px]=py;sz[py]+=sz[px]; } int main() {//IO;int T=1;//cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) cin>>g[i][j];fact[0]=1;for(int i=1;i<=2*n;i++) p[i]=i,sz[i]=1,fact[i]=1ll*fact[i-1]*i%mod;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){bool ok1=1,ok2=1;for(int k=1;k<=n;k++)if(g[i][k]+g[j][k]>m) ok1=0;for(int k=1;k<=n;k++)if(g[k][i]+g[k][j]>m) ok2=0;if(ok1) merge(i,j);if(ok2) merge(i+n,j+n);}ll res=1;for(int i=1;i<=2*n;i++)if(p[i]==i)res=res*fact[sz[i]]%mod;cout<<res<<'\n';}return 0; }總結
以上是生活随笔為你收集整理的ARC107——C - Shuffle Permutation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑玩dnf配置要求(电脑玩dnf配置)
- 下一篇: 《信号与系统》期中总结