Codeforces 650C Table Compression (并查集+拓扑排序)

原创 2016年05月31日 16:14:30

解析:不看tags都意识不到用图论。

一个位置对应一个节点,对于每行每列,值相同的用并查集union一起,值不相同的,值小的节点指向值大的节点。

压缩后节点的值是到该节点的最长的链的长度,可以通过拓扑排序求得。


[code]:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;
const int maxn = 1e6+5;

struct Nod{
    int b,next;
    void init(int b,int next){
        this->b=b;this->next=next;
    }
}buf[maxn<<2];
int n,m,a[maxn],b[maxn],d[maxn],deg[maxn];
int V,len,E[maxn],par[maxn];
int ord[maxn];
queue<int> que;

bool cmp(const int &i,const int &j){
    return a[i] < a[j];
}

void init(){
    V = n*m;
    len = 0;
    memset(E,-1,sizeof(E));
    for(int i = 0;i < V;i++) par[i] = i;
}
int find(int x){
    return par[x]==x?x:par[x]=find(par[x]);
}
void unite(int x,int y){
    x = find(x),y = find(y);
    if(x == y) return;
    par[y] = x;
}
void add_edge(int a,int b){
    buf[len].init(b,E[a]);E[a]=len++;
    deg[b]++;
}
void pre_preocess(){
    int i,j;
    for(i = 0;i < n;i++){
        for(j = 0;j < m;j++){
            ord[j] = i*m+j;
        }
        sort(ord,ord+m,cmp);
        for(j = 1;j < m;j++){
            if(a[ord[j-1]]==a[ord[j]]) unite(ord[j],ord[j-1]);
        }
    }
    for(j = 0;j < m;j++){
        for(i = 0;i < n;i++){
            ord[i] = i*m+j;
        }
        sort(ord,ord+n,cmp);
        for(i = 1;i < n;i++){
            if(a[ord[i-1]]==a[ord[i]]) unite(ord[i],ord[i-1]);
        }
    }
}
void sol(){
    int i,j,u,v;
    for(i = 0;i < V;i++) if(find(i)==i&°[i]==0) que.push(i);
    while(!que.empty()){
        u = que.front();que.pop();
        for(i = E[u];i != -1;i = buf[i].next){
            v = buf[i].b;
            d[v] = max(d[v],d[u]+1);
            if(--deg[v]==0){
                que.push(v);
            }
        }
    }
    for(i = 0;i < V;i++){
        printf("%d ",d[find(i)]+1);
        if((i+1)%m==0) putchar('\n');
    }
}

int main(){
    int i,j;
    scanf("%d%d",&n,&m);
    init();
    for(i = 0;i < n*m;i++) scanf("%d",&a[i]);
    pre_preocess();
    for(i = 0;i < n;i++){
        for(j = 0;j < m;j++){
            ord[j] = i*m+j;
        }
        sort(ord,ord+m,cmp);
        for(j = 1;j < m;j++){
            if(a[ord[j-1]]==a[ord[j]]) continue;
            add_edge(find(ord[j-1]),find(ord[j]));
        }
    }
    for(j = 0;j < m;j++){
        for(i = 0;i < n;i++){
            ord[i] = i*m+j;
        }
        sort(ord,ord+n,cmp);
        for(i = 1;i < n;i++){
            if(a[ord[i-1]]==a[ord[i]]) continue;
            add_edge(find(ord[i-1]),find(ord[i]));
        }
    }
    sol();
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces 650C Table Compression

C. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes ...
  • abgnwl
  • abgnwl
  • 2016年03月12日 14:11
  • 748

【Codeforces650C】Table Compression【并查集】【拓扑排序】

先排序,把大小相同的元素合并成一个集合。注意这些元素不一定在位置上相邻。 然后再排序,从小到大建边。 最后做个bfs,每个点的答案为并查集中的最大值。 /* Footprints In The B...
  • BraketBN
  • BraketBN
  • 2016年03月08日 23:32
  • 396

Codeforces 651E Table Compression【并查集】

占坑补题
  • Yukizzz
  • Yukizzz
  • 2016年03月12日 10:01
  • 433

codeforces 650C (并查集)

C. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes ...
  • morejarphone
  • morejarphone
  • 2016年04月01日 23:27
  • 385

Codeforces 412D Giving Awards(拓扑排序)

题目链接:Codeforces 412D Giving Awards 题目大意:就是
  • u011328934
  • u011328934
  • 2014年04月20日 12:58
  • 1005

【并查集分块】Codeforces 475D CGCDSSQ

题目点这里 bin神说这题和他当年出的一道题差不多TAT 听了半天终于听懂了TAT。。。 利用gcd的递减性 从左往右把一段的gcd和最新的数相同的的放到一个并查集里去。。 可以证明段...
  • qq_21841245
  • qq_21841245
  • 2015年04月16日 22:41
  • 574

Codeforces 292D (并查集巧妙运用)

题意:一个无向图,给出m条边,有k次询问,每次询问将第l到r条边暂时删去,求这时候有多少个连通分量。 思路;首先预处理,分别从前往后和从后往前合并,从前往后的并查集用s[i]表示,代表从第1条边...
  • Ezereal
  • Ezereal
  • 2016年03月17日 11:23
  • 609

Codeforces 651E:Table Compression

E. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes input s...
  • u010885899
  • u010885899
  • 2016年03月09日 18:10
  • 672

CodeForces 825F String Compression---这个KMP很DP

Ivan wants to write a letter to his friend. The letter is a string s consisting of lowercase Latin l...
  • qq_34143240
  • qq_34143240
  • 2017年08月04日 15:09
  • 247

41 Which statements are true regarding table compression? (Choose all that apply.) A. It saves disk

41 Which statements are true regarding table compression? (Choose all that apply.) A. It saves dis...
  • EVISWANG
  • EVISWANG
  • 2015年12月11日 16:18
  • 427
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces 650C Table Compression (并查集+拓扑排序)
举报原因:
原因补充:

(最多只允许输入30个字)