#include #include using namespace std; #define INF 1000000000 #define MAXN 300 int N, K, sirka, vyska; pair body[MAXN]; // najmenšie obdĺžniky, ktoré majú hornú // resp. dolnú hranicu na danej súradnici int minNad[MAXN]; int minPod[MAXN]; int ries() { // usporiadame body podľa x-ovej súradnice sort(body,body+N); for (int i = 0; i < N; i++) minNad[i] = minPod[i] = INF; for (int a = 0; a < N; a++) { // dolná hranica okienka pre y for (int b = 0; b < N; b++) { // horná hranica okienka pre y int y1 = body[a].second; int y2 = body[b].second; // vyfiltrujeme si body, ktoré su medzi hranicami pair bodyMedzi[MAXN]; int M = 0; for (int i = 0; i < N; i++) { if (y1 <= body[i].second && body[i].second <= y2) bodyMedzi[M++] = body[i]; } // vybrané body prejdeme metódou okienka int i = 0, j = 0; // ľavá a pravá hranica okienka while (i < M) { int x1 = bodyMedzi[i].first; int x2 = bodyMedzi[j].first; // ak je v okienku menej ako K bodov, // posunieme pravý okraj okienka a započítame // všetky nové body, ktoré doň vstúpia while (j < M && (j-i) < K) { x2 = bodyMedzi[j].first; while (j < M && bodyMedzi[j].first == x2) j++; } // ak máme v okienku práve K bodov, // započítame konfiguráciu if ((j-i) == K) { minPod[b] = min(minPod[b],y2-y1+x2-x1); minNad[a] = min(minNad[a],y2-y1+x2-x1); } // posunieme ľavý okraj okienka a odpočítame body, // ktoré z okienka vypadnú while (i < M && bodyMedzi[i].first == x1) { i++; } } } } int minSuma = INF; // vyskúšať všetky kombinácie dvoch disjunktných riešení for (int y1 = 0; y1 < N; y1++) { for (int y2 = 0; y2 < N; y2++) { if (body[y1].second < body[y2].second) minSuma = min(minSuma,minPod[y1]+minNad[y2]); } } return minSuma; } int main() { cin >> sirka >> vyska >> N >> K; for (int i = 0; i < N; i++) cin >> body[i].first >> body[i].second; // vyriešime optimum pre horizontálnu čiaru int minimum1 = ries(); // otočíme okolo diagonály for (int i = 0; i < N; i++) swap(body[i].first, body[i].second); // vyriešime optimum pre vertikálnu čiaru int minimum2 = ries(); // skontrolujeme, či existuje riešenie if (minimum1 == INF && minimum2 == INF) cout << "riesenie neexistuje" << endl; else cout << 2*min(minimum1,minimum2) << endl; return 0; }