Cod sursa(job #1877236)

Utilizator PletoPletosu Cosmin-Andrei Pleto Data 13 februarie 2017 09:50:49
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#define NMAX 65000

using namespace std;

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

int TT[NMAX], RG[NMAX], CARD[NMAX], MAX=1;
int sol[NMAX];
int dl[] = {-1,0,1,0};
int dc[] = {0,1,0,-1};
bool V[252][252];
struct {
    int x, y;
} A[NMAX];

int find(int x) {
    int R, y;
    for (R = x; TT[R] != R; R = TT[R]);
    for (; TT[x] != x;) {
        y = TT[x];
        TT[x] = R;
        x = y;
    }
    return R;
}

void unite(int x, int y) {
    if (RG[x] > RG[y]) {
        CARD[y] += CARD[x];
        MAX = max(MAX, CARD[y]);
        TT[y] = x;
    }
    else {
        CARD[x] += CARD[y];
        MAX = max(MAX, CARD[x]);
        TT[x] = y;
    }
    if (RG[x] == RG[y]) RG[y]++;
}

int main() {
    int N, vf;
    fin>>N;
    vf = N*N;
    for(int i = 1; i <= vf; ++i) {
        fin>>A[i].x>>A[i].y;
        TT[i] = i;
        RG[i] = 1;
        CARD[i] = 1;
    }
    while(vf--) {
        V[A[vf].x][A[vf].y] = true;
        int R = find((A[vf].x-1)*N + A[vf].y);
        for(int i = 0; i < 4; ++i) {
            int xx = A[vf].x + dl[i];
            int yy = A[vf].y + dc[i];
            if(V[xx][yy]) {
                int K = find((xx-1)*N + yy);
                if(R != K) {
                    unite(R, K);
                }
            }
        }
        sol[vf] = MAX;
    }
    vf = N*N;
    for(int i = 1; i < vf; ++i)
        fout<<sol[i]<<'\n';
    fout<<0<<'\n';
    fin.close(); fout.close();
    return 0;
}