Codeforces Round #345 (Div. 1) C. Table Compression dp+并查集
题目链接:
http://codeforces.com/problemset/problem/650/C
C. Table Compression
time limit per test4 secondsmemory 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的方格,每个方格上有一个正整数,现在要把这些数离散化,要保证离散化之后同一行或同一列的数之间大小关系不变,构造一种解使得最大的那个值最小
题解
#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+并查集的更多相关文章
- 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 ...
- 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 #346 (Div. 2) F. Polycarp and Hay 并查集
题目链接: 题目 F. Polycarp and Hay time limit per test: 4 seconds memory limit per test: 512 megabytes inp ...
- Codeforces Round #375 (Div. 2) D. Lakes in Berland 并查集
http://codeforces.com/contest/723/problem/D 这题是只能把小河填了,题目那里有写,其实如果读懂题这题是挺简单的,预处理出每一块的大小,排好序,从小到大填就行了 ...
随机推荐
- 常见的移动端H5页面开发遇到的坑和解决办法
转过来,平时看看.虽然还有很多问题至今无解.比如:华为麒麟950的P8和meta打开我们的应用首页经常偶发白屏.!! 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是 ...
- homebrew 使用心得
''' 安装anaconda 安装命令: brew search anaconda brew cask install anaconda 添加环境变量: vi ~/.bash_profile expo ...
- sed: unix与doc换行的转换
在Linux (Unix)平台下回车换行以\n表示 在Window平台下回车换行以\r\n表示 两者的差异导致了: 在window下看Linux的文本排版全乱 在Linux在看Window的文本则是存 ...
- Oracle入门第六天(下)——高级子查询
一.概述 主要内容: 二.子查询介绍 1.简单子查询(WHERE子查询) SELECT last_name FROM employees WHERE salary > (SELECT salar ...
- 20155210 2016-2017-2 《Java程序设计》第10周学习总结
20155210 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输.按照计算 ...
- 20155339 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile以及myod
20155339 2017-2018-1<信息安全系统设计>第四周课堂测试.Makefile以及myod 测试1-vi 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号 用Vi ...
- 你真的认为iphone只是一部手机么
闲言不表,直奔主题.我是一个程序员,上周参加了一个开源软件交流大会,其实会上并没有听到什么新鲜的东西.但是在会中,偶然间听到了一个关于iphone的秘密,却着实令我震惊了,事情具体是这样的,听我慢慢道 ...
- 【转载】从零实现3D图像引擎:(1)环境配置与项目框架
原文:从零实现3D图像引擎:(1)环境配置与项目框架 0. 要学懂3D程序设计,必然要精通3D相关的线性代数.3D几何.复分析等相关知识,我也因为如此才开始这个博客系列的写作,不自己实现,就不是自己的 ...
- MySQL主从失败报错误: Got fatal error 1236
一.问题原因及报错误信息 由于MySQL主库意外重启,导致从库无法同步报错如下: 登录从库查看主从同步的错误信息 [root@--- mysql]# vim mysqld-error.log -- : ...
- Entity Framework中执行Sql语句
如果想在EF框架中执行Sql语句,其实很简单,EF里面已经提供了相关的方法(此处使用的EF为EF4.1版本). EF中提供了两个方法,一个是执行查询的Sql语句SqlQue ...