Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <utility>
- #include <algorithm>
- #include <cmath>
- #include <set>
- #include <map>
- #include <vector>
- using namespace std;
- #define FOR(a, b) for (int a = 0; a < b; a++)
- #define clr(a) memset(a, 0, sizeof(a))
- #define ll long long
- //define _in_s(a, b) (((a) < h)&&((a) >= 0)&&((b) < w)&&((b) >= 0))
- //const ll INF = (ll)1000000000 * (ll)1000000000;
- const int INF = 1000000000;
- struct point{
- short int x, y;
- };
- int l, w, n, k;
- int m[250][250];
- int pr[250][250];
- int ml[250];
- int mr[250];
- inline int getS(int x1, int y1, int x2, int y2)
- {
- if (y1 == 0 && x1 == 0) return pr[x2][y2];
- if (y1 == 0) return pr[x2][y2] - pr[x1 - 1][y2];
- if (x1 == 0) return pr[x2][y2] - pr[x2][y1 - 1];
- return pr[x2][y2] - pr[x2][y1 - 1] - pr[x1 - 1][y2] + pr[x1 - 1][y1 - 1];
- }
- inline int getP(int x1, int y1, int x2, int y2)
- {
- return 2 * (x2 - x1 + y2 - y1 + 2);
- }
- int main()
- {
- //freopen("b.in", "r", stdin);
- //freopen("b.out", "w", stdout);
- clr(m);
- scanf("%d%d%d%d", &l, &w, &n, &k);
- FOR(i, n)
- {
- int x, y;
- scanf("%d%d", &x, &y);
- x--, y--;
- m[x][y]++;
- }
- pr[0][0] = m[0][0];
- FOR(i, l)
- FOR(j, w)
- {
- if (i == 0 && j == 0) continue;
- if (i == 0)
- {
- pr[i][j] = pr[i][j - 1] + m[i][j];
- continue;
- }
- if (j == 0)
- {
- pr[i][j] = pr[i - 1][j] + m[i][j];
- continue;
- }
- pr[i][j] = m[i][j] + pr[i - 1][j] + pr[i][j - 1] - pr[i - 1][j - 1];
- }
- /*FOR(i, l)
- {
- FOR(j, w)
- cout << pr[i][j] << ' ';
- cout << '\n';
- }*/
- FOR(i, l) ml[i] = INF;
- FOR(i, l) mr[i] = INF;
- FOR(i, l)
- for (int j = i; j < l; ++j)
- {
- int b = 0;
- for (int t = 0; t < w; ++t)
- {
- while (b < t && ((getS(i, b, j, t) > k) || (getS(i, b, j, b) == 0))) b++;
- if (getS(i, b, j, t) == k)
- {
- ml[j] = min(ml[j], getP(i, b, j, t));
- mr[i] = min(mr[i], getP(i, b, j, t));
- }
- }
- }
- int ans = INF;
- for (int i = 0; i < l - 1; ++i)
- {
- int min1 = INF;
- FOR(j, i + 1)
- min1 = min(min1, ml[j]);
- int min2 = INF;
- for (int j = i + 1; j < l; ++j)
- min2 = min(min2, mr[j]);
- ans = min(ans, min1 + min2);
- }
- FOR(i, w) ml[i] = INF;
- FOR(i, w) mr[i] = INF;
- FOR(i, w)
- for (int j = i; j < w; ++j)
- {
- int b = 0;
- for (int t = 0; t < l; ++t)
- {
- while (b < t && ((getS(b, i, t, j) > k) || (getS(b, i, b, j) == 0))) b++;
- if (getS(b, i, t, j) == k)
- {
- ml[j] = min(ml[j], getP(b, i, t, j));
- mr[i] = min(mr[i], getP(b, i, t, j));
- }
- }
- }
- for (int i = 0; i < w - 1; ++i)
- {
- int min1 = INF;
- FOR(j, i + 1)
- min1 = min(min1, ml[j]);
- int min2 = INF;
- for (int j = i + 1; j < w; ++j)
- min2 = min(min2, mr[j]);
- ans = min(ans, min1 + min2);
- }
- if (ans == INF)
- cout << "NO";
- else cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement