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 题解 直接 ...
随机推荐
- jsp一句话木马总结
一.无回显的命令执行(命令执行后不会在前端页面返回数据) <%Runtime.getRuntime().exec(request.getParameter("i"));%&g ...
- 回溯、贪心、DP的区别和联系
四大常用算法:分治.贪心.回溯.动态规划 回溯算法是个"万金油".基本上能用跟动态规划.贪心解决的问题,都可以用回溯去解决.回溯算法相当于穷举搜索,穷举所有情况,然后得到最优解.不 ...
- [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)
(2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...
- 使用RandomAccessFile实现数据的插入效果
@Testpublic void test3() { RandomAccessFile raf1 = null; try { raf1 = new RandomAccessFile("hel ...
- MyBatis第一个程序
创建一个maven项目,并且在pom.xml导入myBatis和jdbc的jar包 <dependencies> <dependency> <groupId>org ...
- 「题解报告」CF1067A Array Without Local Maximums
大佬们的题解都太深奥了,直接把转移方程放出来让其他大佬们感性理解,蒟蒻们很难理解,所以我就写了一篇让像我一样的蒟蒻能看懂的题解 原题传送门 动态规划三部曲:确定状态,转移方程,初始状态和答案. --神 ...
- AtCoder Beginner Contest 260 (D-E)
AtCoder Beginner Contest 260 - AtCoder D - Draw Your Cards 题意:N张卡牌数字 1-n,以某种顺序排放,每次拿一张,如果这一张比前面某一张小( ...
- An iOS zero-click radio proximity exploit odyssey
NOTE: This specific issue was fixed before the launch of Privacy-Preserving Contact Tracing in iOS 1 ...
- Python获取时光网电影数据
Python获取时光网电影数据 一.前言 有时候觉得电影真是人类有史以来最伟大的发明,我喜欢看电影,看电影可以让我们增长见闻,学习知识.从某种角度上而言,电影凭借自身独有的魅力大大延长了人类的&quo ...
- FastJson远程命令执行漏洞学习笔记
FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...