题目链接:

http://codeforces.com/problemset/problem/650/C

C. Table Compression

time limit per test4 seconds
memory limit per test256 megabytes
#### 问题描述
> 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 
> 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 2
> 3 4

样例输出

1 2

2 3

题意

给你一个n*m的方格,每个方格上有一个正整数,现在要把这些数离散化,要保证离散化之后同一行或同一列的数之间大小关系不变,构造一种解使得最大的那个值最小

题解

[Portal]

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf typedef __int64 LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn=1e6+10; int n,m;
int val[maxn],dp[maxn],ra[maxn],ind[maxn];
VI G[maxn];
VPII egs; int fa[maxn];
int find(int x){
return fa[x]=fa[x]==x?x:find(fa[x]);
} bool cmp(int a,int b){
return val[a]<val[b];
} void init(){
for(int i=0;i<=n*m;i++) fa[i]=i,dp[i]=-1,ind[i]=0;
} int main() {
scf("%d%d",&n,&m);
init();
rep(i,0,n) rep(j,0,m){
scf("%d",&val[i*m+j]);
} //每行/每列 排序,然后连成串(这样可以少连很多没有用的边
rep(i,0,n){
rep(j,0,m) ra[j]=i*m+j;
sort(ra,ra+m,cmp);
for(int j=0;j<m-1;j++){
int p1=ra[j],p2=ra[j+1];
if(val[p1]<val[p2]){
egs.pb(mkp(p1,p2));
}else{
fa[find(p2)]=fa[find(p1)];
}
}
} rep(j,0,m){
rep(i,0,n) ra[i]=i*m+j;
sort(ra,ra+n,cmp);
for(int i=0;i<n-1;i++){
int p1=ra[i],p2=ra[i+1];
if(val[p1]<val[p2]){
egs.pb(mkp(p1,p2));
}else{
fa[find(p2)]=fa[find(p1)];
}
}
} //用并查集缩点
for(int i=0;i<egs.sz();i++){
int pu=find(egs[i].X),pv=find(egs[i].Y);
G[pu].pb(pv);
ind[pv]++;
} //拓扑排序
queue<int> Q; rep(i,0,n*m){
if(fa[i]!=i) continue;
if(ind[i]==0){
dp[i]=1;
Q.push(i);
}
} while(!Q.empty()){
int u=Q.front(); Q.pop();
for(int i=0;i<G[u].sz();i++){
int v=G[u][i];
dp[v]=max(dp[v],dp[u]+1);
ind[v]--;
if(ind[v]==0) Q.push(v);
}
} rep(i,0,n){
rep(j,0,m){
int x=dp[find(i*m+j)];
prf("%d",x);
if(j==m-1) puts("");
else prf(" ");
}
} return 0;
} //end-----------------------------------------------------------------------

Codeforces Round #345 (Div. 1) C. Table Compression dp+并查集的更多相关文章

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

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

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

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

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

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

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

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

  7. Codeforces Round #181 (Div. 2) B. Coach 带权并查集

    B. Coach 题目连接: http://www.codeforces.com/contest/300/problem/A Description A programming coach has n ...

  8. Codeforces Round #346 (Div. 2) F. Polycarp and Hay 并查集

    题目链接: 题目 F. Polycarp and Hay time limit per test: 4 seconds memory limit per test: 512 megabytes inp ...

  9. Codeforces Round #375 (Div. 2) D. Lakes in Berland 并查集

    http://codeforces.com/contest/723/problem/D 这题是只能把小河填了,题目那里有写,其实如果读懂题这题是挺简单的,预处理出每一块的大小,排好序,从小到大填就行了 ...

随机推荐

  1. javascript对象定义及创建

    javascript对象 定义 javascript中的对象,可以理解成是一个键值对的集合,键是调用每个值的名称,值可以是基本变量,还可以是函数和对象. 创建方法 第一种方法 通过顶级Object类来 ...

  2. ES6学习之-let 和const命令

    let 和const命令 let命令 用来声明变量,类似于var .let声明的变量 只在let命令所在的代码块内有效. 在for循环里也是如此 每次循环其实都是一个代码块 function fn() ...

  3. webpack4+Vue搭建自己的Vue-cli

    前言 最近在看webpack4,深感知识浅薄,这两天也一直在思考cli的配置,借助一些别人的实践,尝试自己搭建vue的项目,这里使用webpack4版本,之前我在网上查找别人的vue项目搭建,但是都是 ...

  4. 在Windows下编译mongo-c-driver 1.3.x

    在Windows下编译mongo-c-driver 1.3.x 在Windows下编译mongo-c-driver 1.3.x 1.安装 MSYS2https://sourceforge.net/pr ...

  5. Oracle之子程序(存储过程、方法、包)

    .过程[存储过程] CREATE [OR REPLACE] PROCEDURE <procedure name> [(<parameter list>)] IS|AS < ...

  6. 虚拟机与ARM之间的交叉编译总结

    通过三大服务的配置,我们可以在ARM中下载内核和文件系统.我们通过在虚拟机中编程,得到的程序不能在ARM中运行,需要经过一个交叉编译.得到的可执行程序可以在ARM中运行,此时不能在虚拟机Linux中运 ...

  7. 20155305 2016-2017-2 《Java程序设计》实验四 Android开发基础设计实验报告

    实验内容 1.Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: 安装 ...

  8. 20145226夏艺华 《Java程序设计》第9周学习总结

    教材学习内容总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛型和自定义枚举 会使用标准注解 第16章 整合数据库 16.1 JDBC入门 (一)JDB ...

  9. 【LG3703】[SDOI2017]树点涂色

    [LG3703][SDOI2017]树点涂色 题面 洛谷 题解 更博辣,更博辣!!! 猪年的第一篇博客 一次只能染根到\(x\),且染的颜色未出现过 这句话是我们解题的关键. 设\(x\)到根的颜色数 ...

  10. Drupal学习(19) 使用jQuery

    本节学习如果在Drupal里交互使用jQuery. jQuery在Drupal是内置支持的.存在根目录的misc目录中. 当调用drupal_add_js方法,会自动加载jQuery. 在Drupal ...