Codeforces Round #812 (Div. 2) E(并查集)
种类并查集:定义种类之间的关系来判断操作是否进行
题目大意:对于题目给出的一个矩阵,我们可以进行一种操作:swap(a[i][j],a[j][i])
使得矩阵可以变换为字典序最小的矩阵
思路:
通过扫描整个矩阵,每次都判断a[i][j] 和 a[j][i]是否需要交换
交换的前提就是: 对第i行/第j列操作,如果既对第 i 行又第 j 列进行操作等于没交换
所以我们可以将 i 和 j定义为敌人,当 他们是敌人的时候,说明需要交换
而他们是朋友的时候就说明无需交换
这里就涉及到种类并查集了,我们定义一个2*n的数组,如果i 和 j 是敌人:
merge( i , j+n );
merge( i+n , j );
这样在查询时如果find(i)>n说明i与另外一个元素有敌对关系,可以进行交换
否则如果是朋友:
merge( i , j );
merge( i+n , j+n );
find(i) <= n 说明他们为朋友关系,不可以交换

1 # include<iostream>
2 # include<bits/stdc++.h>
3 using namespace std;
4 # define int long long
5 # define endl "\n"
6 const int N = 2e5 + 10;
7 int a[1010][1010];
8 int f[1010 << 1];
9 vector<int> siz(1010 << 1);
10 int find(int x) {
11 if (f[x] == x) return x;
12 else return find(f[x]);
13 }
14
15 void merge(int a, int b) {
16 int x = find(a);
17 int y = find(b);
18 if (x != y) {
19 if(siz[x]>siz[y]) swap(x,y);
20 f[x] = y;
21 siz[y] += siz[x];
22 }
23 }
24 void solve() {
25 int n;
26 cin >> n;
27 for (int i = 1; i <= n; ++i)
28 for (int j = 1; j <= n; ++j)
29 cin >> a[i][j];
30 for (int i = 1; i <= 2 * n; ++i) {
31 f[i] = i;
32 siz[i] = 1;
33 }
34 for (int i = 1; i <= n; ++i)
35 for (int j = i + 1; j <= n; ++j) {
36 if (a[i][j] > a[j][i]) {
37 int x = find(i), y = find(j);
38 if (x == y) continue;
39 merge(i, j + n);
40 merge(i + n, j);
41 } else if (a[i][j] < a[j][i]) {
42 int x = find(i), y = find(j + n);
43 if (x == y) continue;
44 merge(i, j);
45 merge(i + n, j + n);
46 }
47 }
48 for (int j = 1; j <= n; ++j) {
49 if (find(j) > n) continue;
50 for (int i = 1; i <= n; ++i) swap(a[i][j], a[j][i]);
51 }
52 for (int i = 1; i <= n; ++i) {
53 for (int j = 1; j <= n; ++j) {
54 cout << a[i][j] << " ";
55 }
56 cout << endl;
57 }
58
59 }
60 int tt;
61 signed main() {
62 ios::sync_with_stdio(false);
63 cin.tie(0);
64 cout.tie(0);
65 cin >> tt;
66 while (tt--)solve();
67
68
69 return 0;
70 }
需要注意的是,因为要求字典序最小,所以要求优先满足之前的关系,所以在每次维护关系的时候
需要先对之前的关系进行判断。
Codeforces Round #812 (Div. 2) E(并查集)的更多相关文章
- Codeforces Round #376 (Div. 2) C. Socks---并查集+贪心
题目链接:http://codeforces.com/problemset/problem/731/C 题意:有n只袜子,每只都有一个颜色,现在他的妈妈要去出差m天,然后让他每天穿第 L 和第 R 只 ...
- Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序
https://codeforces.com/contest/1131/problem/D 题意 给你一个n*m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[] ...
- Codeforces Round #286 (Div. 2) B 并查集
B. Mr. Kitayuta's Colorful Graph time limit per test 1 second memory limit per test 256 megabytes in ...
- Codeforces Round #812 (Div. 2) D. Tournament Countdown(交互题)
记录一下第一次写交互题 题目大意:一共有1<<n个人参加一场竞标赛,需要你通过比较两人的胜场来判断谁晋级,最终获得第一名 最多1/3*2^(n+1)次询问,每次询问query(a,b),如 ...
- Codeforces Round #374 (div.2)遗憾题合集
C.Journey 读错题目了...不是无向图,结果建错图了(喵第4样例是变成无向就会有环的那种图) 并且这题因为要求路径点尽可能多 其实可以规约为限定路径长的拓扑排序,不一定要用最短路做 #prag ...
- DFS/并查集 Codeforces Round #286 (Div. 2) B - Mr. Kitayuta's Colorful Graph
题目传送门 /* 题意:两点之间有不同颜色的线连通,问两点间单一颜色连通的路径有几条 DFS:暴力每个颜色,以u走到v为结束标志,累加条数 注意:无向图 */ #include <cstdio& ...
- Codeforces Round #582 (Div. 3)-G. Path Queries-并查集
Codeforces Round #582 (Div. 3)-G. Path Queries-并查集 [Problem Description] 给你一棵树,求有多少条简单路径\((u,v)\),满足 ...
- Codeforces Round #346 (Div. 2)---E. New Reform--- 并查集(或连通图)
Codeforces Round #346 (Div. 2)---E. New Reform E. New Reform time limit per test 1 second memory lim ...
- Codeforces Round #383 (Div. 2) 题解【ABCDE】
Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...
随机推荐
- 基于SpringSecurity的@PreAuthorize实现自定义权限校验方法
一.前言 在我们一般的web系统中必不可少的就是权限的配置,也有经典的RBAC权限模型,是基于角色的权限控制.这是目前最常被开发者使用也是相对易用.通用权限模型.当然SpringSecurity已经实 ...
- 【NOI P模拟赛】寻找道路(bfs,最短路)
题面 一道特殊的最短路题. 给一个 n n n 个点 m m m 条有向边的图,每条边上有数字 0 \tt0 0 或 1 \tt1 1 ,定义一个路径的长度为这个路径上依次经过的边上的数字拼在一起后在 ...
- yield功能分析
下面是示例 输出结果: starting... 4 ******************** res: None 4
- KingbaseES 局部索引
一个列要不要建立btree索引,判断条件是其键值分布是否够离散,比如主键.唯一键,可以建立索引.如果这个列有大量重复的值,则建立索引没有意义. 在生产环境中常会碰到键值分布不均匀的列,如表t1有一个名 ...
- KingbaseES OOM 可能原因汇总
背景 不久前,遇到过一个问题.KingbaseES数据库主机系统触发OOM现象是数据库进程被KILL, 数据库进入crash然后restart(when restart_after_crash=on) ...
- MySQL DDL执行方式-Online DDL介绍
1 引言 大家好,今天与大家一起分享一下 mysql DDL执行方式. 一般来说MySQL分为DDL(定义)和DML(操作). DDL:Data Definition Language,即数据定义语言 ...
- 优化过的containerd配置文件:config.toml
disabled_plugins = [] imports = [] oom_score = 0 plugin_dir = "" required_plugins = [] roo ...
- ProxySQL 审计
1.审计日志 ProxySQL 2.0.5 引入了审计日志.此功能允许跟踪某些连接活动.要启用此功能,需要配置变量 mysql-auditlog_filename,也就是审计日志的文件名.此变量的默认 ...
- Kubernetes DevOps: Harbor
Harbor 是一个 CNCF 基金会托管的开源的可信的云原生 docker registry 项目,可以用于存储.签名.扫描镜像内容,Harbor 通过添加一些常用的功能如安全性.身份权限管理等来扩 ...
- Mapping
dynamic针对的是新增的字段,不是对mapping中已有的字段 (原有mapping中的字段不受影响,只影响新增的字段) 当dynamic被设置成false的时候,存在新增字段可以被写入到索引文件 ...