Nu aveti permisiuni pentru a descarca fisierul grader_test36.ok

Cod sursa(job #2862790)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 5 martie 2022 20:41:45
Problema Matrice 2 Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <bits/stdc++.h>
using namespace std;

const int dim=309,inf=1e6;

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

int dx[]={0,1,-1,0};
int dy[]={1,0,0,-1};

int n,q;
int v[dim][dim];
int nr[dim][dim];

int parent[dim*dim],sz[dim*dim];
int find_set(int x){
    if(x==parent[x]){
        return x;
    }
    return parent[x]=find_set(parent[x]);
}
void union_sets(int x,int y){
    int a=find_set(x);
    int b=find_set(y);
    if(a!=b){
        if(sz[a]<sz[b]){
            swap(a,b);
        }
        parent[b]=a;
        sz[a]+=sz[b];
    }
}

struct elem{
    int v,i,j;
    bool operator<(const elem &other) const{
        return v>other.v;
    }
};

vector<elem>w;

bool in(int i,int j){
    return 1<=i&&i<=n&&1<=j&&j<=n;
}

bool verifica(int x1,int y1,int x2,int y2,int h){
    for(int i=1;i<=n*n;i++){
        parent[i]=i;
        sz[i]=1;
    }
    for(elem it:w){
        int val=it.v,i=it.i,j=it.j;
        if(val<h){
            break;
        }
        for(int l=0;l<4;l++){
            int inou=i+dx[l],jnou=j+dy[l];
            if(in(inou,jnou)&&v[inou][jnou]>=h){
                if(find_set(nr[i][j])!=find_set(nr[inou][jnou])){
                    union_sets(nr[i][j],nr[inou][jnou]);
                }
            }
        }
    }
    if(find_set(nr[x1][y1])==find_set(nr[x2][y2])){
        return true;
    }
    return false;
}

signed main(){
        fin>>n>>q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            fin>>v[i][j];
            nr[i][j]=(i-1)*n+j;
            w.push_back({v[i][j],i,j});
        }
    }
    sort(w.begin(),w.end());
    while(q--){
        int x1,x2,y1,y2;
        fin>>x1>>y1>>x2>>y2;
        int st=1,dr=inf,retine=0;
        while(st<=dr){
            int mij=(st+dr)/2;
            if(verifica(x1,y1,x2,y2,mij)){
                retine=mij;
                st=mij+1;
            }else{
                dr=mij-1;
            }
        }
        fout<<retine<<'\n';
    }
}