Advertisement
Guest User

Untitled

a guest
Nov 9th, 2018
521
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.03 KB | None | 0 0
  1. #ifdef DEBUG
  2. #define _GLIBCXX_DEBUG
  3. #endif
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7. using namespace std;
  8.  
  9. typedef long double ld;
  10.  
  11. #define eprintf(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
  12.  
  13. #define sz(x) ((int) (x).size())
  14. #define TASK "text"
  15.  
  16. const int inf = (int) 1.01e9;
  17. const long long infll = (long long) 1.01e18;
  18. const ld eps = 1e-9;
  19. const ld pi = acos((ld) -1);
  20.  
  21. mt19937 mrand(random_device{} ());
  22.  
  23. int rnd(int x) {
  24.   return mrand() % x;
  25. }
  26.  
  27. const int maxn = (int) 2e3 + 5;
  28.  
  29. vector<int> xs, ys;
  30.  
  31. struct node {
  32.   long long mnr, mxr, len;
  33.   long long toass;
  34. };
  35.  
  36. node st[4 * maxn];
  37. long long vals[maxn];
  38.  
  39. void buildst(int v, int tl, int tr) {
  40.   st[v].toass = -infll;
  41.   if (tl == tr - 1) {
  42.     st[v].mnr = ys[tl] + vals[tl];
  43.     st[v].mxr = ys[tl] + vals[tl];
  44.     st[v].len = vals[tl];
  45.     return;
  46.   }
  47.   int tm = (tl + tr) / 2;
  48.   buildst(2 * v, tl, tm);
  49.   buildst(2 * v + 1, tm, tr);
  50.   st[v].mnr = min(st[2 * v].mnr, st[2 * v + 1].mnr);
  51.   st[v].mxr = max(st[2 * v].mxr, st[2 * v + 1].mxr);
  52.   st[v].len = min(st[2 * v].len, st[2 * v + 1].len);
  53. }
  54.  
  55. void push(int v, int r0, int r1) {
  56.   if (st[v].toass == -infll) {
  57.     return;
  58.   }
  59.   long long ry = st[v].toass;
  60.   for (int i = 0; i < 2; i++) {
  61.     int u = 2 * v + i;
  62.     int ur = (!i ? r0 : r1);
  63.     st[u].mnr = ry;
  64.     st[u].mxr = ry;
  65.     st[u].len = ry - (ys[ur - 1]);
  66.     st[u].toass = ry;
  67.   }
  68.   st[v].toass = -infll;
  69. }
  70.  
  71. void update(int v, int tl, int tr, int ly, long long ry) {
  72.   if (tr <= ly) {
  73.     return;
  74.   }
  75.   if (st[v].mnr >= ry) {
  76.     return;
  77.   }
  78.   if (ly <= tl && st[v].mxr < ry) {
  79.     st[v].mnr = ry;
  80.     st[v].mxr = ry;
  81.     st[v].len = ry - (ys[tr - 1]);
  82.     st[v].toass = ry;
  83.     return;
  84.   }
  85.   int tm = (tl + tr) / 2;
  86.   push(v, tm, tr);
  87.   update(2 * v, tl, tm, ly, ry);
  88.   update(2 * v + 1, tm, tr, ly, ry);
  89.   st[v].mnr = min(st[2 * v].mnr, st[2 * v + 1].mnr);
  90.   st[v].mxr = max(st[2 * v].mxr, st[2 * v + 1].mxr);
  91.   st[v].len = min(st[2 * v].len, st[2 * v + 1].len);
  92. }
  93.  
  94. vector<int> evs[maxn];
  95. vector<int> cols[maxn];
  96. int cnt[maxn];
  97. int lst[maxn];
  98. int prv[maxn], nxt[maxn];
  99.  
  100. struct ColorfulEnclosure {
  101.   long long minArea(int k, vector<int> px, vector<int> py, vector<int> c) {
  102.     xs = px;
  103.     sort(xs.begin(), xs.end());
  104.     xs.erase(unique(xs.begin(), xs.end()), xs.end());
  105.     ys = py;
  106.     sort(ys.begin(), ys.end());
  107.     ys.erase(unique(ys.begin(), ys.end()), ys.end());
  108.     for (int i = 0; i < sz(px); i++) {
  109.       px[i] = lower_bound(xs.begin(), xs.end(), px[i]) - xs.begin();
  110.       py[i] = lower_bound(ys.begin(), ys.end(), py[i]) - ys.begin();
  111.     }
  112.     vector<pair<pair<int, int>, int>> ps;
  113.     for (int i = 0; i < sz(px); i++) {
  114.       ps.push_back(make_pair(make_pair(py[i], px[i]), c[i]));
  115.     }
  116.     sort(ps.begin(), ps.end());
  117.     long long res = 4 * infll;
  118.     for (int x0 = 0; x0 < sz(xs); x0++) {
  119.       for (int i = 0; i < sz(ps); i++) {
  120.         if (ps[i].first.second < x0) {
  121.           ps.erase(ps.begin() + i);
  122.           i--;
  123.         }
  124.       }
  125.       for (int i = 0; i < sz(xs); i++) {
  126.         evs[i].clear();
  127.       }
  128.       for (int i = 0; i < sz(ys); i++) {
  129.         cols[i].clear();
  130.       }
  131.       for (int i = 0; i < sz(ps); i++) {
  132.         evs[ps[i].first.second].push_back(i);
  133.         cols[ps[i].first.first].push_back(ps[i].second);
  134.       }
  135.       for (int i = 0; i < k; i++) {
  136.         cnt[i] = 0;
  137.       }
  138.       int good = 0;
  139.       for (int l = 0, r = 0; l < sz(ys); l++) {
  140.         while (r < sz(ys) && good < k) {
  141.           for (int i = 0; i < sz(cols[r]); i++) {
  142.             int col = cols[r][i];
  143.             good -= (cnt[col] > 0);
  144.             cnt[col]++;
  145.             good += (cnt[col] > 0);
  146.           }
  147.           r++;
  148.         }
  149.         vals[l] = (good == k ? ys[r - 1] - ys[l] : infll);
  150.         for (int i = 0; i < sz(cols[l]); i++) {
  151.           int col = cols[l][i];
  152.           good -= (cnt[col] > 0);
  153.           cnt[col]--;
  154.           good += (cnt[col] > 0);
  155.         }
  156.       }
  157.       buildst(1, 0, sz(ys));
  158.       for (int i = 0; i < k; i++) {
  159.         lst[i] = -1;
  160.       }
  161.       for (int i = 0; i < sz(ps); i++) {
  162.         prv[i] = lst[ps[i].second];
  163.         lst[ps[i].second] = i;
  164.       }
  165.       for (int i = 0; i < k; i++) {
  166.         lst[i] = sz(ps);
  167.       }
  168.       for (int i = sz(ps) - 1; i >= 0; i--) {
  169.         nxt[i] = lst[ps[i].second];
  170.         lst[ps[i].second] = i;
  171.       }
  172.       for (int x1 = sz(xs); x1 > x0; x1--) {
  173.         long long len = st[1].len;
  174.         if (len >= infll / 2) {
  175.           break;
  176.         }
  177.         res = min(res, len * (xs[x1 - 1] - xs[x0]));
  178.         for (int i = 0; i < sz(evs[x1 - 1]); i++) {
  179.           int id = evs[x1 - 1][i];
  180.           int pid = prv[id], nid = nxt[id];
  181.           if (pid >= 0) {
  182.             nxt[pid] = nid;
  183.           }
  184.           if (nid < sz(ps)) {
  185.             prv[nid] = pid;
  186.           }
  187.           int ly = (pid < 0 ? 0 : ps[pid].first.first + 1);
  188.           int ry = (nid >= sz(ps) ? sz(ys) : ps[nid].first.first);
  189.           update(1, 0, sz(ys), ly, (ry < sz(ys) ? ys[ry] : infll));
  190.         }
  191.       }
  192.     }
  193.     return res;
  194.   }
  195. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement