Cod sursa(job #719332)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 21 martie 2012 18:56:18
Problema Matrice 2 Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <algorithm>
#define MAXN 310
#define VMAX 1000000
using namespace std;
const int dx[5]={0,0,1,-1};
const int dy[5]={1,-1,0,0};

typedef struct{
int x,y,v;
}mat;
mat a[MAXN*MAXN];
int poz[MAXN][MAXN],val[MAXN][MAXN],el1,el2,l,r,h,q,d,x1,x2,yf,y2,m,n,t[MAXN*MAXN];
int grupa(int i)
{
	if(t[i]==i) return i;
	t[i]=grupa(t[i]);
	return t[i];
}
void reunite(int i,int j)
{
	int up=grupa(i);
	t[up]=grupa(j);
}
bool cmp(mat x,mat y)
{
	return x.v>y.v;
}
bool valid(int x,int y)
{
	return (x<=m and x>0 and y<=m and y>0  and val[x][y]>=h);
}
int main()
{
	int i,j;
	ifstream fi("matrice2.in");
	ofstream fo("matrice2.out");
	fi>>n>>q;
	for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
	{
		fi>>a[(i-1)*n+j].v;
		a[(i-1)*n+j].x=i;
		a[(i-1)*n+j].y=j;
	}
	m=n*n;
	sort(a+1,a+m+1,cmp);
	for(i=1;i<=m;i++) { poz[a[i].x][a[i].y]=i; val[a[i].x][a[i].y]=a[i].v; }
	while(q--)
	{
		fi>>x1>>yf>>x2>>y2;
		el1=poz[x1][yf]; el2=poz[x2][y2];
		l=1; r=VMAX;
		while(l<r)
		{
			if(h==(l+r)/2) break;
			h=(l+r)/2;
			for(i=1;i<=m;i++) t[i]=i;
			for(i=1;i<=m and a[i].v>=h;i++)
			{
				for(d=0;d<4;d++)
				if(grupa(i)!=grupa(poz[a[i].x+dx[d]][a[i].y+dy[d]]) and valid(a[i].x+dx[d],a[i].y+dy[d])) reunite(i,poz[a[i].x+dx[d]][a[i].y+dy[d]]);
			}
			if(grupa(el1)==grupa(el2)) l=h; else r=h+1;
		}
		fo<<l<<"\n";
	}
	return 0;
}