Cod sursa(job #595319)

Utilizator RazvanSSavu Razvan RazvanS Data 11 iunie 2011 21:18:30
Problema Tribute Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>

#define file_input "tribute.in"
#define file_output "tribute.out"

#define N_MAX 50000
#define VEC_LEN (N_MAX+1)

int N, DX, DY, LIN[VEC_LEN], COL[VEC_LEN];
int Sld[VEC_LEN], Sru[VEC_LEN];

int main ( void ) {

	FILE* fin = fopen(file_input,"r");
	FILE* fout = fopen(file_output,"w");

	fscanf(fin,"%d %d %d", &N, &DX, &DY);

	int i, x, y;
	for (i=0;i<N;++i) {

		fscanf(fin,"%d %d", &x, &y);
		COL[x]++;
		LIN[y]++;
	}
	fclose(fin);

	int count = COL[0];
	for (i=1;i<=N_MAX;++i) {
		 
		Sld[i] = Sld[i-1] + count;
		count += COL[i];
	}
		
	count = COL[N_MAX];
	for (i=N_MAX-1;i>=0;--i) {

		Sru[i] = Sru[i+1] + count;
		count += COL[i];
	}
	
	int minX = Sld[0]+Sru[DX];
	// printf("%d\n", Sru[DX]);
	for(i=1;i<=N_MAX-DX;++i) 
		if(Sld[i]+Sru[i+DX] < minX) minX = Sld[i]+Sru[i+DX];

	for(i=0;i<=N_MAX;++i) {
		Sld[i]=0;
		Sru[i]=0;
	}

	count = LIN[0];
	for(i=1;i<=N_MAX;++i) {
		
		Sld[i] = Sld[i-1] + count;
		count += LIN[i];
	}

	count = LIN[N_MAX];
	for(i=N_MAX-1;i>=0;--i) {

		Sru[i] = Sru[i+1] + count;
		count += LIN[i];
	}

	int minY = Sld[0] + Sru[DY];
	for(i=1;i<=N_MAX-DY;++i)
		if(Sld[i] + Sru[i+DY] < minY) minY = Sld[i] + Sru[i+DY];


	fprintf(fout,"%d\n", minX + minY);
	fclose(fout);
	
	return 0;
}