Cod sursa(job #1994925)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 26 iunie 2017 16:52:38
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <bits/stdc++.h>
#define l first
#define c second
#define MAXN 300
#define MAXQ 20000

int mat[MAXN + 2][MAXN + 2];
std::pair <int, int> v[MAXN * MAXN + 1];

bool cmp(std::pair <int, int> a, std::pair <int, int> b) {
     return mat[a.l][a.c] < mat[b.l][b.c];
}

int sef[MAXN * MAXN + 1];

int myfind(int x) {
     if(sef[x] == 0)
        return x;
     return sef[x] = myfind(sef[x]);
}

int sol[MAXQ + 1];

struct Query {
     int ind1, ind2;
     int pos;
     bool operator <(const Query &other) const {
          return sol[pos] > sol[other.pos];
     }
}qry[MAXQ + 1];


char dl[] = {-1, 0, 1, 0}, dc[] = {0, -1, 0, 1};

inline void check(int pas, int n, int q) {
     std::sort(qry + 1, qry + q + 1);
     memset(sef, 0, sizeof(sef));
     int p = n * n;
     for(int i = 1; i <= q; i++) {
         while(p >= 1 && mat[v[p].l][v[p].c] >= sol[qry[i].pos] + pas) {
             int nod = v[p].l * n + v[p].c - n;
             for(int j = 0; j < 4; j++) {
                int l = v[p].l + dl[j];
                int c = v[p].c + dc[j];
                if(l > 0 && l <= n && c > 0 && c <= n && mat[l][c] >= sol[qry[i].pos] + pas && myfind(nod) != myfind(l * n + c - n))
                    sef[myfind(nod)] = myfind(l * n + c - n);
             }
             p--;
         }
         if(myfind(qry[i].ind1) == myfind(qry[i].ind2))
             sol[qry[i].pos] += pas;
     }
}

int main() {
    FILE *fi, *fout;
    int i, j, n, q;
    fi = fopen("matrice2.in" ,"r");
    fout = fopen("matrice2.out" ,"w");
    fscanf(fi,"%d %d " ,&n,&q);
    int sz = 0;
    for(i = 1; i <= n; i++)
       for(j = 1; j <= n; j++) {
         fscanf(fi,"%d " ,&mat[i][j]);
         sz++;
         v[sz].l = i;
         v[sz].c = j;
       }
    std::sort(v + 1, v + sz + 1, cmp);
    for(i = 1; i <= q; i++) {
       int x1, y1, x2, y2;
       fscanf(fi,"%d %d %d %d " ,&x1, &y1, &x2, &y2);
       qry[i].ind1 = x1 * n + y1 - n;
       qry[i].ind2 = x2 * n + y2 - n;
       qry[i].pos = i;
    }
    for(int pas = 1 << 19; pas; pas >>= 1)
       check(pas, n, q);
    for(i = 1; i <= q; i++)
       fprintf(fout,"%d\n" ,sol[i]);
    fclose(fi);
    fclose(fout);
    return 0;
}