codeforces Codeforces Round #345 (Div. 1) C. Table Compression 排序+并查集
Little Petya is now fond of data compression algorithms. He has already studied gz, bz, zip algorithms and many others. Inspired by the new knowledge, Petya is now developing the new compression algorithm which he wants to name dis.
Petya decided to compress tables. He is given a table a consisting of n rows and m columns that is filled with positive integers. He wants to build the table a' consisting of positive integers such that the relative order of the elements in each row and each column remains the same. That is, if in some row i of the initial table ai, j < ai, k, then in the resulting table a'i, j < a'i, k, and if ai, j = ai, k then a'i, j = a'i, k. Similarly, if in some column j of the initial table ai, j < ap, j then in compressed table a'i, j < a'p, j and if ai, j = ap, j then a'i, j = a'p, j.
Because large values require more space to store them, the maximum value in a' should be as small as possible.
Petya is good in theory, however, he needs your help to implement the algorithm.
The first line of the input contains two integers n and m (
, the number of rows and the number of columns of the table respectively.
Each of the following n rows contain m integers ai, j (1 ≤ ai, j ≤ 109) that are the values in the table.
Output the compressed table in form of n lines each containing m integers.
If there exist several answers such that the maximum number in the compressed table is minimum possible, you are allowed to output any of them.
2 2
1
4
1 2
2 3
4 3
20 10 30
50 40 30
50 60 70
90 80 70
2 1 3
5 4 3
5 6 7
9 8 7
In the first sample test, despite the fact a1, 2 ≠ a21, they are not located in the same row or column so they may become equal after the compression.
题意:个数不超过1e6个数的二维数列;按照行与列数的相对大小尽可能的缩小为正整数,但不在同一行或同一列的数的缩放前后的大小没有关系;
输出缩放后的数列;
思路:排序后每次处理都是处理值相等的一串数据,并且是看成没没有填入到新数组中,这样使用并查集就可以得到“十”字形相等的根节点的最大值,即所有这棵并查集下的节点的值;x[i],y[i]来模拟并查集,X[],Y[]表示行列上一个值填到的数值,所以之后直接得到根节点所要填入的值;
#include<bits/stdc++.h>
using namespace std;
int i,j,k,n,m,T,tot;
const int N = ;
struct data{
int r,c,v,id;
}p[N];
bool cmp(const data &a,const data &b){return a.v < b.v;}
int f[N],X[N],Y[N],ans[N],x[N],y[N],tmp[N];
int Find(int a){return a==f[a]?f[a]:f[a]=Find(f[a]);}
int main()
{
scanf("%d%d",&n,&m);
for(i = ;i <= n;i++)
for(j = ;j <= m;j++){
scanf("%d",&p[++tot].v);
p[tot].r = i,p[tot].c = j;
p[tot].id = tot;
f[tot] = tot;
}
sort(p+,p++tot,cmp);
for(i = ;i <= tot;i = j){
for(j = i;p[i].v == p[j].v;++j);
for(k = i;k < j;k++){
int r = p[k].r, c = p[k].c;
if(!x[r]) x[r] = k;// 行并查
else f[Find(k)] = Find(x[r]);
if(!y[c]) y[c] = k;
else f[Find(k)] = Find(y[c]);//f[k]会因为十字型交叉而出错;
}
for(k = i;k < j;k++){//只是在之前的值的基础上得到,不是模拟填入值
int q = Find(k);
tmp[q] = max(tmp[q],max(X[p[k].r],Y[p[k].c])+);
}
for(k = i;k < j;k++){//根节点得到的是全体的值
x[p[k].r] = y[p[k].c] = ;
X[p[k].r] = Y[p[k].c] = ans[p[k].id] = tmp[Find(k)];
}
}
for(i = ;i <= tot;i++){
printf("%d ",ans[i]);
if(i%m == ) puts("");
}
}
codeforces Codeforces Round #345 (Div. 1) C. Table Compression 排序+并查集的更多相关文章
- Codeforces Round #345 (Div. 1) C. Table Compression dp+并查集
题目链接: http://codeforces.com/problemset/problem/650/C C. Table Compression time limit per test4 secon ...
- Codeforces Round #345 (Div. 2) E. Table Compression(并查集)
传送门 首先先从小到大排序,如果没有重复的元素,直接一个一个往上填即可,每一个数就等于当前行和列的最大值 + 1 如果某一行或列上有重复的元素,就用并查集把他们连起来,很(不)显然,处于同一行或列的相 ...
- Codeforces Round #345 (Div. 2) E. Table Compression 并查集
E. Table Compression 题目连接: http://www.codeforces.com/contest/651/problem/E Description Little Petya ...
- Codeforces Round #345 (Div. 2) E. Table Compression 并查集+智商题
E. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- Codeforces Round #345 (Div. 1) C. Table Compression (并查集)
Little Petya is now fond of data compression algorithms. He has already studied gz, bz, zip algorith ...
- Codeforces Round #346 (Div. 2) F. Polycarp and Hay 并查集 bfs
F. Polycarp and Hay 题目连接: http://www.codeforces.com/contest/659/problem/F Description The farmer Pol ...
- Codeforces Round #181 (Div. 2) B. Coach 带权并查集
B. Coach 题目连接: http://www.codeforces.com/contest/300/problem/A Description A programming coach has n ...
- Codeforces Round #375 (Div. 2) D. Lakes in Berland 并查集
http://codeforces.com/contest/723/problem/D 这题是只能把小河填了,题目那里有写,其实如果读懂题这题是挺简单的,预处理出每一块的大小,排好序,从小到大填就行了 ...
- Codeforces Round #363 (Div. 2) D. Fix a Tree —— 并查集
题目链接:http://codeforces.com/contest/699/problem/D D. Fix a Tree time limit per test 2 seconds memory ...
随机推荐
- PAT 1010
1010. Radix (25) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 11 ...
- How to allow/block PING on Linux server – IPTables rules for icmp---reference
BY ADMIN - APRIL, 9TH 2014 The ‘PING’, it’s a command-line tool to check a host is reachable or not. ...
- 圆满完成Web安全测试培训课程广州公开班!
圆满完成Web安全测试培训课程广州公开班! http://gdtesting.com/news.php?id=187 下期<Web安全测试最佳实践>公开课通知:8月9.10日地点:广州 课 ...
- Hibernate - list()和iterate()的区别
list()和iterate()都可以用来获得Query取得的HQL结果list()使用的是即时加载.查询时会之前去数据库查询HQL并将所有结果存在缓存中.iterate()使用的是延时加载.查询时只 ...
- 【shell】 I/O重定向
1.基本概念 a.I/O重定向通常与 FD有关,shell的FD通常为10个,即 0-9: b.常用FD有3个,为0(stdin,标准输入).1(stdout,标准输出).2(stderr,标准错 ...
- SharePoint2013 SharePoint-Hosted 模式 分页方法
/**分页js插件 var ListPager = new listPaging(); 先调用start方法加载上下文 然后调用dataLoad方法查询第一页数据 需要设置几个属性值 ListPage ...
- HTTP层 —— 请求
1.访问请求实例 要通过依赖注入获取当前 HTTP 请求实例,需要在控制器的构造函数或方法中对 Illuminate\Http\Request 类进行类型提示,这样当前请求实例会被服务容器自动注入: ...
- GlusterFS集群文件系统概述
http://blog.csdn.net/zonelan/article/details/8468383 1. GlusterFS概述 GlusterFS是Scale-Out存储解决方案Gl ...
- 用DataSet方式更新数据库表
/* 用DataSet的方式更新数据库表 * 注意:用DataSet更新数据库表的时候,该表必须指定主键或者是唯一列 */ string connString = "Data Source= ...
- ###STL学习--标准模板库
下面进行STL的学习.希望能了解标准模板库中的常用容器,迭代器,可以自由运用STL以提高编写代码的效率.下面的内容我想以知识点为总结,不再像<Effective C++>那样以章节进行总结 ...