Cod sursa(job #2229537)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 7 august 2018 10:54:44
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <vector>
#include <fstream>
#define pii pair<int,int>

using namespace std;

const int MAXN = 255;

ifstream in("bile.in");
ofstream out("bile.out");

int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
int n,maxim = 1,card[MAXN*MAXN],rang[MAXN*MAXN],tata[MAXN*MAXN],ans[MAXN*MAXN];
bool matrice[MAXN][MAXN];
vector<pii>v;

int Find(int nod){
    int stapan = nod;

    while(tata[stapan] != stapan)
        stapan = tata[stapan];
    while(tata[nod] != stapan){
        int copie = nod;
        tata[copie] = stapan;
        nod = tata[nod];
    }
    return stapan;
}
int Union(int x,int y){
    if(x==y)
        return 0;
    if(rang[x] > rang[y]) {
        card[x] += card[y];
        maxim = max(maxim,card[x]);
        tata[y] = x;
    }else if(rang[y] <= x) {
        card[y] += card[x];
        maxim = max(maxim,card[y]);
        tata[x] = y;
    }
    if(rang[x] == rang[y])
        rang[y]++;
}
int F(int x,int y){
    return (x - 1)*n + y;
}
bool in_matrice(int x,int y){
    if(x >= 1 && y >= 1 && x <= n && y <= n && matrice[x][y])
        return true;
    return false;
}
void Vecin(int x,int y){
    int xnou,ynou;
    for(int i = 0; i < 4; i++){
        xnou = x + dx[i];
        ynou = y + dy[i];
        if(in_matrice(xnou,ynou))
            Union(Find(F(x,y)),Find(F(xnou,ynou)));
    }
}
int main()
{


    in>>n;
    v.reserve(n*n);
    for(int i = 1; i <= n*n; i++){
        tata[i] = i;
        rang[i] = 1;
        card[i] = 1;
    }
    for(int i = 1; i <= n*n; i++){
        int x,y;
        in>>x>>y;
        v.push_back({x,y});
    }

    for(int i = n*n - 1; i >= 0; i--){
        matrice[v[i].first][v[i].second] = true;
        Vecin(v[i].first,v[i].second);
        ans[i] = maxim;
    }
    for(int i = 1; i <= n * n; i++)
        out<<ans[i]<<"\n";
    return 0;
}