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.

Input

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

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.

Examples
input
2 2
1 2
3 4
output
1 2
2 3
input
4 3
20 10 30
50 40 30
50 60 70
90 80 70
output
2 1 3
5 4 3
5 6 7

9 8 7

题意:给你一个n*n的由数字组成的矩阵,让你尽量缩小这个矩阵中的值,使得缩小前后两个矩阵每一行每一列任意两个数对应的大小关系一致。

思路:先考虑所有的点对应的数都不同,那么我们只要对所有的数排个序,然后依次编号就行了,相当于一次离散化。那么现在给你的矩形是有相同元素的,可以观察到同一行或者同一列的数缩小后也是一样的,且它们最小能缩小到的数是符合它们各自所在行的之前算出来的最小数+1,我们可以用并查集把这些数都统一成一个数,然后就能算了。

<pre name="code" class="cpp">#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define inf 99999999
#define pi acos(-1.0)
#define maxn 1000050
struct node{
int x,y,num,idx;
}a[maxn];
bool cmp(node a,node b){
return a.num<b.num;
}
int X[maxn],Y[maxn],x[maxn],y[maxn]; int ans[maxn];
int pre[maxn]; int findset(int x)
{
int i=x,j,r=x;
while(r!=pre[r]){
r=pre[r];
}
while(i!=pre[i]){
j=pre[i];
pre[i]=r;
i=j;
}
return r; } int main()
{
int n,m,i,j,c,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
int tot=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%d",&c);
tot++;
a[tot].x=i;a[tot].y=j;
a[tot].idx=tot;a[tot].num=c;
pre[tot]=tot;
}
}
sort(a+1,a+1+tot,cmp); for(i=1;i<=tot;){
for(j=i;a[i].num==a[j].num;j++);
int r,c;
for(k=i;k<j;k++){
r=a[k].x;c=a[k].y;
if(!x[r])x[r]=a[k].idx ;
else{
pre[findset(a[k].idx ) ]=findset(x[r]);
}
if(!y[c])y[c]=a[k].idx ;
else{
pre[findset(a[k].idx ) ]=findset(y[c]);
}
}
for(k=i;k<j;k++){
int q=findset(a[k].idx );
int answer=max(X[a[k].x ],Y[a[k].y ] )+1;
ans[q]=max(ans[q],answer );
}
for(k=i;k<j;k++){
X[a[k].x ]=Y[a[k].y ]=ans[a[k].idx ]=ans[findset(a[k].idx ) ];
x[a[k].x ]=y[a[k].y ]=0;
}
i=j;
}
int flag=1; for(i=1;i<=tot;i++){
if(flag){
flag=0;printf("%d",ans[i]);
}
else{
printf(" %d",ans[i]);
}
if(i%m==0){
flag=1;printf("\n");
}
}
}
return 0;
}

Codeforces Round #345 (Div. 1) C. 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 ...

  2. 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 ...

  3. Codeforces Round #345 (Div. 1) C. Table Compression dp+并查集

    题目链接: http://codeforces.com/problemset/problem/650/C C. Table Compression time limit per test4 secon ...

  4. codeforces Codeforces Round #345 (Div. 1) C. Table Compression 排序+并查集

    C. Table Compression Little Petya is now fond of data compression algorithms. He has already studied ...

  5. Codeforces Round #345 (Div. 1) E. Clockwork Bomb 并查集

    E. Clockwork Bomb 题目连接: http://www.codeforces.com/contest/650/problem/E Description My name is James ...

  6. Codeforces Round #345 (Div. 2) E. Table Compression(并查集)

    传送门 首先先从小到大排序,如果没有重复的元素,直接一个一个往上填即可,每一个数就等于当前行和列的最大值 + 1 如果某一行或列上有重复的元素,就用并查集把他们连起来,很(不)显然,处于同一行或列的相 ...

  7. Codeforces Round #245 (Div. 2) B. Balls Game 并查集

    B. Balls Game Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/430/problem ...

  8. Codeforces Round #603 (Div. 2) D. Secret Passwords 并查集

    D. Secret Passwords One unknown hacker wants to get the admin's password of AtForces testing system, ...

  9. Codeforces Round #600 (Div. 2) D题【并查集+思维】

    题意:给你n个点,m条边,然后让你使得这个这个图成为一个协和图,需要加几条边.协和图就是,如果两个点之间有一条边,那么左端点与这之间任意一个点之间都要有条边. 思路:通过并查集不断维护连通量的最大编号 ...

随机推荐

  1. 【Java基础】Java8 新特性

    Java8 新特性 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).使用它可以写出更简洁.更灵活的代码. L ...

  2. 谈谈你不知道的gist

    1.Gist是什么关于Gist的详细介绍,请阅读官方文档About gists,下面只简略介绍部分功能: Gist是一种与其他人共享代码片段和粘贴的简单方法. 当您需要与同事或朋友共享示例代码或技术时 ...

  3. 【MySQL】Last_SQL_Errno: 1594Relay log read failure: Could not parse relay log event entry...问题总结处理

    备库报错: Last_SQL_Errno: 1594 Last_SQL_Error: Relay log read failure: Could not parse relay log event e ...

  4. 容器编排系统K8s之包管理器Helm基础使用

    前文我们了解了k8s上的hpa资源的使用,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14293237.html:今天我们来聊一下k8s包管理器helm的相 ...

  5. MySQL 5.6.35 索引优化导致的死锁案例解析

    一.背景 随着公司业务的发展,商品库存从商品中心独立出来成为一个独立的系统,承接主站商品库存校验.订单库存扣减.售后库存释放等业务.在上线之前我们对于核心接口进行了压测,压测过程中出现了 MySQL ...

  6. 简单的DbContext工厂类(EFCore)

    前言 根据appsettings.json的中配置的数据库类型,使用工厂模式创建DbContext 代码实现 appsettings.json中的配置项 //使用的数据库类型 "Server ...

  7. 计算机网络安全 —— 非对称加密算法 RSA 和数字签名(二)

    一.非对称加密算法基本概念 在对称密钥系统中,两个参与者要共享同一个秘密密钥.但怎样才能做到这一点呢?一种是事先约定,另一种是用信使来传送.在高度自动化的大型计算机网络中,用信使来传送密钥显然是不合适 ...

  8.  Go is more about software engineering than programming language research.

    https://talks.golang.org/2012/splash.article Go at Google: Language Design in the Service of Softwar ...

  9. LOJ10068 秘密的牛奶运输

    LOJ10068秘密的牛奶运输 题目描述 Farmer John 要把他的牛奶运输到各个销售点.运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的 ...

  10. 【Android初级】如何实现一个具有选择功能的对话框效果(附源码)

    我们去餐厅吃饭时,服务员都会拿菜单给我们选择点什么菜.今天就分享一个具有选择功能的简易对话框,给用户展示一个选择列表.实现思路如下: 既然有选择列表,那么这个列表的内容肯定保存在某个地方 用户选择某一 ...