Advertisement
Mlxa

Convex hull на массивах

Apr 20th, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.70 KB | None | 0 0
  1. point a[N], u[N], d[N];
  2. int as = 0, us = 0, ds = 0;
  3.  
  4. void convex_hull() {
  5.     assert(us == 0);
  6.     while (ds) {
  7.         a[as++] = d[--ds];
  8.     }
  9.     assert(ds == 0);
  10.     sort(a, a + as);
  11.     as = unique(a, a + as) - a;
  12.     if (as < 3) {
  13.         copy_n(a, as, d);
  14.         ds = as;
  15.         as = 0;
  16.         return;
  17.     }
  18.     for (int i = 0; i < as; ++i) {
  19.         if (i == 0 || i == as - 1 || a[0].rt(a[i], a[as - 1])) {
  20.             while (us >= 2 && !u[us - 2].rt(u[us - 1], a[i])) {
  21.                 --us;
  22.             }
  23.             u[us++] = a[i];
  24.         }
  25.         if (i == 0 || i == as - 1 || a[0].lt(a[i], a[as - 1])) {
  26.             while (ds >= 2 && !d[ds - 2].lt(d[ds - 1], a[i])) {
  27.                 --ds;
  28.             }
  29.             d[ds++] = a[i];
  30.         }
  31.     }
  32.     for (int i = us - 2; i >= 1; --i) {
  33.         d[ds++] = u[i];
  34.     }
  35.     us = 0;
  36.     as = 0;
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement