ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1713E Cross Swapping

2022-08-08 19:35:19  阅读:340  来源: 互联网

标签:qaq Swapping dep Cross fa CF1713E fd id qwq


https://codeforces.com/contest/1713/problem/E

image

写了个随机合并的并查集,,,没过。。。。。。

反手按秩!!!!!!!!!

#include <bits/stdc++.h>
//#define int long long
#define ID(i,j) ((i-1)*n+j)
#define pb push_back
using namespace std;
const int M=1002,N=(int)(2e6+5);
int n,a[M][M],dep[M],id[2][M],ans[M][M],fa[M*2];

int fd(int x) {
//	cout<<x<<' '<<fa[x]<<'\n';
	return x==fa[x]?x:fd(fa[x]);
}

void solve() {
	srand(time(0));
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++) {
			cin>>a[i][j];
			ans[i][j]=0;
		}
	int tot=0;
	for(int i=1;i<=n;i++) id[0][i]=++tot,id[1][i]=++tot;
	for(int i=1;i<=tot;i++) dep[i]=1,fa[i]=i;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
//			cout<<i<<" "<<j<<'\n';
			if(ans[i][j]||ans[j][i]||ID(i,j)>ID(j,i)) continue ;
			if(i==j) {
				ans[i][i]=a[i][i]; continue ;
			}
			if(a[i][j]==a[j][i]) {
				ans[i][j]=ans[j][i]=a[i][j]; continue ;
			}
			if(a[i][j]>a[j][i]) {
				int px,x,qwq;bool fl=0;
				int py,y,qaq; bool fl2=0;
				x=fd(id[0][i]); px=fa[x];
				qwq=fd(id[1][j]); 
				if(fa[x]!=qwq) {
					if(dep[x]>dep[qwq]) {
						x=qwq; px=fa[x]; qwq=fd(id[0][i]);
					} else if(dep[x]==dep[qwq]) fl=1;
					fa[x]=qwq;
					if(fl) ++dep[qwq];
					if(fd(id[0][i])==fd(id[1][i])||fd(id[0][j])==fd(id[1][j])) {
						fa[x]=px; 
						if(fl) --dep[qwq];
						ans[i][j]=a[i][j]; ans[j][i]=a[j][i]; continue ;
					}
				}
				y=fd(id[0][j]); py=fa[y];
				qaq=fd(id[1][i]);
				if(qaq!=py) {
					if(dep[y]>dep[qaq]) {
						y=qaq; py=fa[y]; qaq=fd(id[0][j]);
					} else if(dep[y]==dep[qaq]) fl2=1;
					fa[y]=qaq;
					if(fl2) ++dep[qaq];
					if(fd(id[0][i])==fd(id[1][i])||fd(id[0][j])==fd(id[1][j])) {
						fa[x]=px; fa[y]=py; 
						if(fl) --dep[qwq];
						if(fl2) --dep[qaq]; 
						ans[i][j]=a[i][j]; ans[j][i]=a[j][i]; continue ;
					}
				}
				ans[i][j]=a[j][i]; ans[j][i]=a[i][j];
			} else {
				int px,x,qwq;bool fl=0;
				int py,y,qaq; bool fl2=0;
				x=fd(id[0][i]); px=fa[x];
				qwq=fd(id[0][j]); 
				if(fa[x]!=qwq) {
					if(dep[x]>dep[qwq]) {
						x=qwq; px=fa[x]; qwq=fd(id[0][i]);
					} else if(dep[x]==dep[qwq]) fl=1;
					fa[x]=qwq;
					if(fl) ++dep[qwq];
					if(fd(id[0][i])==fd(id[1][i])||fd(id[0][j])==fd(id[1][j])) {
						fa[x]=px; 
						if(fl) --dep[qwq];
						ans[i][j]=a[j][i]; ans[j][i]=a[i][j]; continue ;
					}
				}
				y=fd(id[1][j]); py=fa[y];
				qaq=fd(id[1][i]);
				if(qaq!=py) {
					if(dep[y]>dep[qaq]) {
						y=qaq; py=fa[y]; qaq=fd(id[1][j]);
					} else if(dep[y]==dep[qaq]) fl2=1;
					fa[y]=qaq;
					if(fl2) ++dep[qaq];
					if(fd(id[0][i])==fd(id[1][i])||fd(id[0][j])==fd(id[1][j])) {
						fa[x]=px; fa[y]=py; 
						if(fl) --dep[qwq];
						if(fl2) --dep[qaq]; 
						ans[i][j]=a[j][i]; ans[j][i]=a[i][j]; continue ;
					}
				}
				ans[i][j]=a[i][j]; ans[j][i]=a[j][i];
			}
		}
	} 
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) cout<<ans[i][j]<<' ';
		cout<<'\n';
	}
}

signed main() {
	cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) solve();
	return 0;
}

标签:qaq,Swapping,dep,Cross,fa,CF1713E,fd,id,qwq
来源: https://www.cnblogs.com/xugangfan/p/16563134.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有