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 题解 直接 ...
随机推荐
- 硬件错误导致的crash
[683650.031028] BUG: unable to handle kernel paging request at 000000000001b790--------------------- ...
- SSH免密登录的配置
ssh登录 登录ssh一般情况有两种方法 密码登录 秘钥登录(免密) 大部分情况我们选择都是输入密码登录,平常使用暂时没有遇到什么问题.最近我编写了一些使用scp来传输文件的脚本,每一次scp都需要输 ...
- 【Android 逆向】switch 的smail特征
JAVA 源码 ... String str1 = packedSwitch(1); ... private String packedSwitch(int i) { String str = nul ...
- linux中cd后自动 ls的设置
根据不同的shell设置不太一样.常见的有bash csh两种.可以用echo $SHELL来查询当前是哪一种. bash设置是在用户的home下打开.bashrc在里面加上如下: cd() { bu ...
- 纯CSS实现“流星赶月”,祝大家中秋节快乐
明天就是中秋节了,就想着用CSS画一个月亮送给园友们吧.但是就画一个月亮也太简单了些,于是便加了一些星星点缀以及流星坠落的效果.这篇文章就用纯CSS为大家实现一个"流星赶月"的效果 ...
- Vue3 封装 Element Plus Menu 无限级菜单组件
本文分别使用 SFC(模板方式)和 tsx 方式对 Element Plus el-menu 组件进行二次封装,实现配置化的菜单,有了配置化的菜单,后续便可以根据路由动态渲染菜单. 1 数据结构定义 ...
- Java安全之freemaker模版注入
Java安全之freemaker模版注入 freemaker简介 FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等 ...
- thinkphp5.1中适配百度富文本编辑器ueditor
百度富文本编辑器ueditor虽然很老,但是功能齐全,我近期需要能批量粘贴图片的功能,但是找不到,很无奈.然后现在就分享一下如何把ueditor适配到thinkphp5.1,有知道如何批量上传图片的艾 ...
- innodb_flush_log_at_trx_commit 和 sync_binlog 参数详 解
"innodb_flush_log_at_trx_commit"和"sync_binlog"两个参数是控制 MySQL 磁盘写入策略以及数据安全性的关键参数.当 ...
- ProxySQL 防火墙白名单
ProxySQL 2.0.9 引入了防火墙功能. 在从早期版本版本中,可以通过设置查询规则来创建要阻止的黑名单,或者定义通用规则,实现白名单功能. 但是,如果面对的系统有非常多而且操作内容也不同,这时 ...