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

时间:2022-12-16 15:59:46

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 (Codeforces Round #345 (Div. 1) C. Table Compression (并查集),
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 &num;345 &lpar;Div&period; 2&rpar; E&period; Table Compression 并查集

    E. Table Compression 题目连接: http://www.codeforces.com/contest/651/problem/E Description Little Petya ...

  2. Codeforces Round &num;345 &lpar;Div&period; 2&rpar; E&period; Table Compression 并查集&plus;智商题

    E. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  3. Codeforces Round &num;345 &lpar;Div&period; 1&rpar; C&period; Table Compression dp&plus;并查集

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

  4. codeforces Codeforces Round &num;345 &lpar;Div&period; 1&rpar; C&period; Table Compression 排序&plus;并查集

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

  5. Codeforces Round &num;345 &lpar;Div&period; 1&rpar; E&period; Clockwork Bomb 并查集

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

  6. Codeforces Round &num;345 &lpar;Div&period; 2&rpar; E&period; Table Compression(并查集)

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

  7. Codeforces Round &num;245 &lpar;Div&period; 2&rpar; B&period; Balls Game 并查集

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

  8. Codeforces Round &num;603 &lpar;Div&period; 2&rpar; D&period; Secret Passwords 并查集

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

  9. Codeforces Round &num;600 &lpar;Div&period; 2&rpar; D题【并查集&plus;思维】

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

随机推荐

  1. MSSQLSERVER

    create database test--创建数据库zh use test --打开数据库 go--执行 create table tab--创建表 ( UserName ),--创建字符串类型的字 ...

  2. html 以及JavaScript 转义

    1.之前遇到一个问题,在用js给某个控件赋值时如果含有单引号'或者双引号"有可能导致赋值不成功,如document.getElementById("txtTestBox1&quot ...

  3. extJS 创建类

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  4. LDPC编译码基本原理

    LDPC编译码基本原理     学习笔记 V1.1 2015/02/18 LDPC编译码基本原理   概述   本文是个人针对LDPC的学习笔记,主要针对LDPC译码算法做了简要的总结.该版本主要致力 ...

  5. jQuery邮箱格式验证代码

    代码实例如下: <!DOCTYPE html><html><head><meta charset="utf-8"><meta ...

  6. &lbrack;Flex&rsqb; IFrame系列 —— 嵌入本地页面两种方式source和content(html页面和html代码)

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  7. C编程实现2的1000次方(使程序中的n&equals;1000即可)

    #include<stdio.h> #include<malloc.h> void double_(int n) { ,j,s,jw=; p=(int *)malloc(siz ...

  8. mysql show processlist命令 详解

    SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此信息.如果您有SUPER权限,您可以看到所有线程.否则,您只能看到您自己的线程( ...

  9. 创建文本节点createTextNode

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. Java多线程知识整理

    多线程 1. 多线程基础 多线程状态转换图 普通方法介绍 yeild yeild,线程让步.是当前线程执行完后所有线程又统一回到同一起跑线.让自己或者其他线程运行,并不是单纯的让给其他线程. join ...