Pagini recente » Cod sursa (job #2006118) | Cod sursa (job #1291924) | Cod sursa (job #1369249) | Cod sursa (job #2170131) | Cod sursa (job #780090)
Cod sursa(job #780090)
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 50005
#define inf (1<<30)
ifstream f("tribute.in");
ofstream g("tribute.out");
int n, DX, DY, frecX[nmax], frecY[nmax], cnt[nmax], st[nmax], dr[nmax], sus[nmax], jos[nmax];
int rez=0;
void citeste(){
f >> n >> DX >> DY;//nr de pct si dimen terenului;
for(int i=1; i<=n; i++){
int x,y;
f >> x >> y;
++frecX[x];//se afla un pct pe Ox la pct x
++frecY[y];//same
}
}
void sterge(int a[]){
for(int i=0; i<nmax; i++) a[i] = 0;
}
void rezolva(){
//ma intereseaza sa aleg un drepuntghi a. i. distantele de la marginile lui la restul pct sa fi minima;
//aleg primadata unde pun Dx-ul si apou Dy-ul(astea 2 nu depind una fata de alta)
//pt Ox : st[i] = presupun ca latura din partea stanga a drepuntghiului cautat(aia paralela cu Oy) se afla in i;
//=> st[i] = costul la stanga
//dr[i] la dreapta
// si la fel pt Oy
// cnt[i] = cate pct sunt pana in dreapta I inclusiv
//pt Ox :
for(int i=0; i<nmax; i++){
st[i] = 1 * cnt[i-1] + st[i-1];// asta inseamna ca eu le aduc pe toate in i;
cnt[i] = cnt[i-1] + frecX[i];
}
sterge(cnt);
for(int i=nmax-1; i>=0; i--){
dr[i] = 1 * cnt[i+1] + dr[i+1];
cnt[i] = cnt[i+1] + frecX[i];
}
int Min = inf;
for(int i=0; i<nmax; i++){//pp ca i e latura stanga paralele cu OY
if (i+DX < nmax) Min = min(Min, st[i] + dr[i+DX]);
}
rez = Min;
//pt Oy;
sterge(cnt);
for(int i=0; i<nmax; i++){
jos[i] = 1*cnt[i-1] + jos[i-1];
cnt[i] = cnt[i-1] + frecY[i];
}
sterge(cnt);
for(int i=nmax-1; i>=0; i--){
sus[i] = 1*cnt[i+1] + sus[i+1];
cnt[i] = cnt[i+1] + frecY[i];
}
Min = inf;
for(int i=0; i<nmax; i++){
if (i+DY < nmax) Min = min(Min, jos[i] + sus[i+DY]);
}
rez += Min;
g << rez << "\n";
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}