Cod sursa(job #3283103)

Utilizator dragospatakiDragospataki dragospataki Data 8 martie 2025 10:16:43
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <iostream>
#include <fstream>

#include <vector>

using namespace std;

int n;
ifstream in ("bile.in");
ofstream out ("bile.out");
int mat[302][302];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int tata[1000000];
int frec[1000000];
bool inmat(int x,int y){
    if(x<=n&&x>0&&y<=n&&y>0)
    return true;
    return false;
}
vector <pair<int,int>> edge;
vector <int> ras;
int rad(int x){
    if(tata[x]==x)
    return x;
    return (rad(tata[x]));
}
bool comp(int x, int y){
    int rx=rad(x);
    int ry=rad(y);
    if(rx==ry)
    return true;
    return false;
}
void unite(int x,int y){
    int rx=rad(x);
    int ry=rad(y);
    if(frec[rx]<frec[ry]){
        tata[ry]=rx;
        frec[rx]+=frec[ry];
    }
    else{
        tata[rx]=ry;
        frec[ry]+=frec[rx];
    }
}
int main(){
    in>>n;
    for(int i=1;i<=n*n;i++){
        tata[i]=i;
        frec[i]=1;
    }
    for(int i=1;i<=n*n;i++){
        int x,y;
        in>>x>>y;
        edge.push_back({x,y});
    }
    int contor=0;
    int maxim=0;
    for(int i=edge.size()-1;i>=0;i--){
        ras.push_back(maxim);
        int x,y;
        x=edge[i].first;
        y=edge[i].second;
        mat[x][y]=1;
        int nodCurent=(x-1)*n+y;
        maxim=max(maxim,frec[tata[nodCurent]]);
        for(int k=0;k<4;k++){
            int vecin=(x+dx[k]-1)*n+y+dy[k];
            if(inmat(x+dx[k],y+dy[k])==true)
            if(mat[x+dx[k]][y+dy[k]]==1){
                if(comp(nodCurent,vecin)==false){
                    unite(nodCurent,vecin);
                    if(frec[tata[nodCurent]]>maxim)
                    maxim=max(maxim,frec[tata[nodCurent]]);
                }
                
            }
        }
        maxim=max(maxim,frec[tata[nodCurent]]);
    }

    for(int i=ras.size()-1;i>=0;i--) {
        out<<ras[i]<< '\n';
    }
    return 0;   
}