Cod sursa(job #1072380)

Utilizator misinoonisim necula misino Data 4 ianuarie 2014 13:27:04
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<fstream>
#include<algorithm>
#include<cstring>
#define NN 90010
#define N 305
#define Q 20100
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
int i,j,n,q,di,t1,t2,k,nr,m,b[N][N],t[NN],a[N][N],sol[Q];
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
struct punct{int x,y;}v[NN];
struct seg{int x1,x2,y1,y2,p;}aq[Q];
inline bool cmp(punct p1,punct p2)
{
    return a[p1.x][p1.y]>a[p2.x][p2.y];
}
inline bool cmp1(seg s1,seg s2)
{
    return sol[s1.p]>sol[s2.p];
}
inline void uneste(int x,int y)
{
    t[y]=x;
  //  g<<x<<' '<<y<<'\n';
}
inline int tata(int x)
{
    if(x==t[x])
    return x;
    return t[x]=tata(t[x]);
}
int main()
{
    f>>n>>q;
    for(i=1;i<=n;++i)
    for(j=1;j<=n;++j)
    {
        f>>a[i][j];
        v[++nr].x=i;
        v[nr].y=j;
    }
    sort(v+1,v+nr+1,cmp);
    for(i=1;i<=q;++i)
    {
        f>>aq[i].x1>>aq[i].y1>>aq[i].x2>>aq[i].y2;
        aq[i].p=i;
    }
    for(k=(1<<20);k;k>>=1)
    {
        sort(aq+1,aq+q+1,cmp1);
        memset(b,0,sizeof(b));
        for(i=1;i<=n*n;++i)
        t[i]=i;
        for(i=j=1,m=0;j<=q;++j)
        {
            while(i<=n*n&&sol[aq[j].p]+k<=a[v[i].x][v[i].y]){b[v[i].x][v[i].y]=++m;for(di=0;di<=3;++di)if(b[v[i].x+dx[di]][v[i].y+dy[di]])uneste(tata(b[v[i].x][v[i].y]),tata(b[v[i].x+dx[di]][v[i].y+dy[di]]));++i;}
            t1=tata(b[aq[j].x1][aq[j].y1]);
            t2=tata(b[aq[j].x2][aq[j].y2]);
            if(t1&&t1==t2)
            sol[aq[j].p]+=k;
        }
    }
    for(i=1;i<=q;++i)
    g<<sol[i]<<'\n';
    return 0;
}