Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- point a[N], u[N], d[N];
- int as = 0, us = 0, ds = 0;
- void convex_hull() {
- assert(us == 0);
- while (ds) {
- a[as++] = d[--ds];
- }
- assert(ds == 0);
- sort(a, a + as);
- as = unique(a, a + as) - a;
- if (as < 3) {
- copy_n(a, as, d);
- ds = as;
- as = 0;
- return;
- }
- for (int i = 0; i < as; ++i) {
- if (i == 0 || i == as - 1 || a[0].rt(a[i], a[as - 1])) {
- while (us >= 2 && !u[us - 2].rt(u[us - 1], a[i])) {
- --us;
- }
- u[us++] = a[i];
- }
- if (i == 0 || i == as - 1 || a[0].lt(a[i], a[as - 1])) {
- while (ds >= 2 && !d[ds - 2].lt(d[ds - 1], a[i])) {
- --ds;
- }
- d[ds++] = a[i];
- }
- }
- for (int i = us - 2; i >= 1; --i) {
- d[ds++] = u[i];
- }
- us = 0;
- as = 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement