题目链接:

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

题意:

给定n*m的矩阵,要求用最小的数表示每个元素,其中各行各列的大小关系保持不变。

分析:

将所有元素从小到大排序,然后找到每个元素相应位置进行填充,由于题目要求是每行每列的大小关系保持不变,所以填充的元素应为所在行和所在列中最大元素+1,保存好各行各列当前的最大值,并根据最后填充的元素不断更新就好啦。

问题是如何处理相同元素以及他们所在行列的更新。

这里使用并查集,将相同元素值的位置保存在一个并查集中,这样就可以保证相同元素在新的矩阵中仍然相等~~~使用并查集新姿势get

代码:

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn = 1000005;
int pa[maxn], _rank[maxn];
int v[maxn], row[maxn], cal[maxn], nv[maxn];
int m, n;
typedef pair<int, int>pii;
pii p[maxn];
#define fi first
#define se second
void init()
{
for(int i = 0; i < n * m; i++)
pa[i] = i;
}
int _find(int x)
{
if(pa[x]==x) return x;
else return pa[x] = _find(pa[x]);
}
void unite(int x, int y)
{
int rx = _find(x), ry = _find(y);
if(rx == ry) return;
if(_rank[rx]>_rank[ry]) pa[ry]=rx;
else {
pa[rx] = ry;
if(_rank[rx]==_rank[ry]) _rank[ry]++;
}
return;
}
bool same(int x, int y)
{
return _find(x)==_find(y);
}
int main (void)
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n * m; i++){
scanf("%d",&v[i]);
p[i] = pii(v[i], i);
}
init();
for(int i = 0; i < n; i++){
map<int, int>tmp;
for(int j = 0; j < m; j++){
if(tmp.count(v[i * m + j])){
unite(tmp[v[i * m + j]], i * m + j);
}else
tmp[v[i * m + j]] = i * m + j;
}
}
for(int j = 0; j < m; j++){
map<int, int>tmp;
for(int i = 0; i < n; i++){
if(tmp.count(v[i * m + j])){
unite(tmp[v[i * m + j]], i * m + j);
}else
tmp[v[i * m + j]] = i * m + j;
}
}
sort(p, p + n * m);
stack<int>tmp;
for(int i = 0; i < n * m; i++){
int id = p[i].se;
int x = id / m, y = id % m;
nv[_find(id)] = max(nv[_find(id)], max(row[x], cal[y]) + 1);
tmp.push(id);
if(p[i].fi !=p[i + 1].fi){
while(!tmp.empty()){
id =tmp.top(); tmp.pop();
x = id / m, y = id % m;
row[x] = nv[_find(id)];
cal[y] = nv[_find(id)];
}
}
}
for(int i = 0; i < n * m; i++)
printf("%d%c", nv[_find(i)], (i + 1)%m == 0?'\n':' '); return 0;
}

好吧,我真是弱得cry,想了好久。。。

Codeforces 651E Table Compression【并查集】的更多相关文章

  1. Codeforces 650C Table Compression (并查集)

    题意:M×N的矩阵 让你保持每行每列的大小对应关系不变,将矩阵重写,重写后的最大值最小. 思路:离散化思想+并查集,详见代码 好题! #include <iostream> #includ ...

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

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

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

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

  5. Code Forces 650 C Table Compression(并查集)

    C. Table Compression time limit per test4 seconds memory limit per test256 megabytes inputstandard i ...

  6. Codeforces 650C Table Compression

    传送门 time limit per test 4 seconds memory limit per test 256 megabytes input standard input output st ...

  7. Codeforces Gym 100463E Spies 并查集

    Spies Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Desc ...

  8. Codeforces 859E Desk Disorder 并查集找环,乘法原理

    题目链接:http://codeforces.com/contest/859/problem/E 题意:有N个人.2N个座位.现在告诉你这N个人它们现在的座位.以及它们想去的座位.每个人可以去它们想去 ...

  9. Codeforces - 828C String Reconstruction —— 并查集find()函数

    题目链接:http://codeforces.com/contest/828/problem/C C. String Reconstruction time limit per test 2 seco ...

随机推荐

  1. Windowsforms 中 进程,线程

    进程: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动. 它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体. Process 类,用来操作进程. 命名空间:using Syst ...

  2. AJPFX关于java数组排序

    /**         *将数组中的两个指定下标的元素交换位置                   *@param arr 要交换元素的数组引用地址值         *@param a 数组索引  ...

  3. ssm基础配置

    1.导包 <dependencies> <dependency> <groupId>org.springframework</groupId> < ...

  4. jmeter 连接 sqlite 进行压力测试

  5. js 日期时间大小比较

    <body> 开始时间:<input onfocus="setday(this)" id="startTime" name="sta ...

  6. 在 Windows Server 上搭建 *** 服务端(转载加亲测)

    转载自:https://diveng.io/build-shadowsocks-server-on-windows-server.html 下面的教程建议大家使用第一种方法安装,说是比较简单.我则使用 ...

  7. cookie设置和读取以及获取超链接参数

    function setCookie(c_name, value, expiredays) { var exdate = new Date() exdate.setDate(exdate.getDat ...

  8. 企业面试之LeetCode刷题心得

    谈起刷LeetCode的心得,想要先扯点别的,说实话我是比较自虐的人,大学时候本专业从来不好好上,一直觊觎着别人的专业,因为自己文科生,总觉得没有项技术在身出门找工作都没有底气,然后看什么炫学什么,简 ...

  9. CreateWindowEx详解

    语法: HWND CreateWindowEx( DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, ...

  10. CAD参数绘制圆(com接口)

    CAD绘制图像的过程中,画圆的情况是非常常见的,用户可以设置圆的圆心位置及半径属性. 主要用到函数说明: _DMxDrawX::DrawCircle 绘制一个圆.详细说明如下: 参数 说明 DOUBL ...