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 这题是只能把小河填了,题目那里有写,其实如果读懂题这题是挺简单的,预处理出每一块的大小,排好序,从小到大填就行了 ...
随机推荐
- js时间与毫秒互相转换
1)日期转换为毫秒 如果格式是:yyyy/mm/dd hh:mm:ss可以直接转换.var oldTime = (new Date("2018/07/09 14:13:11")). ...
- php实现银联支付
银联支付用的还是比较少的,而且开发中也没接触多少,不过因为工作项目用银联支付能降低费率,所以还是接入了银联支付.本文支付为银联网关和WAP支付接口. 官方网站SDK&DEMO:https:// ...
- 大数据学习--day15(常用类:Date--DateFormat--SimpleDateFormat--File--包装类)
常用类:Date--DateFormat--SimpleDateFormat--File--包装类 这些常用类就不像字符串挖那么深了,只列列用法. 时间处理: /** * 时间处理类 * DateFo ...
- 适合初学Altium Designer的教学视频
以下推荐的我都亲自看过,个人感觉确实不错,可以有助于了解流程,以及一些设计规范 首先是凡亿的PCB教学,贵是贵了点,不过也有免费的,讲解的很详细,而且还有专门的群,610359270 http://w ...
- 20155210 2016-2017-2 《Java程序设计》第10周学习总结
20155210 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输.按照计算 ...
- 20155220 实验四 Android开发基础
20155220 实验四 Android开发基础 实验内容 (一)Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for ...
- 【转载】DXUT进阶
原文:DXUT进阶 概要 这个指南涵盖了更多DXUT的高级应用. 这个指南里的大部分功能是可选的, 为了以最小的代价来增强你的应用程序. DXUT提供了一个简单的基于GUI系统的精灵和一个设备设置对话 ...
- 4825: [Hnoi2017]单旋
4825: [Hnoi2017]单旋 链接 分析: 以后采取更保险的方式写代码!!!81行本来以为不特判也可以,然后就总是比答案大1,甚至出现负数,调啊调啊调啊调~~~ 只会旋转最大值和最小值,以最小 ...
- 【MySQL函数】日期篇
1.date_format()函数 date_format(createtime,'%Y') 年 date_format(createtime,'%Y-%m') 年月 date_format(crea ...
- 七、Django之Views
一.概述 视图就是python中的函数,我们通常也称为:视图函数. 视图一般被定义在“app/views.py”中. 视图负责接受Web请求(HttpRequest)URL,进行逻辑处理,并返回Web ...