Andrew算法
- 将所有点排序,x为第一关键字,y为第二关键字
- 从左到右维护上半部分,从右至左维护下半部分
- 栈顶反向延长线的顺时针方向就留下,反之删除栈顶
double andrew(){
sort(q,q+n);
int top = 0;
for (int i = 0;i < n;++i){
while (top >= 2 && area(q[stk[top - 1]],q[stk[top]],q[i]) <= 0){
if (area(q[stk[top - 1]],q[stk[top]],q[i]) < 0)
used[stk[top--]] = 0;
else
top--;
}
stk[++top] = i;
used[i] = 1;
}
used[0] = 0;
for (int i = n-1;i >= 0;--i){
if (used[i]) continue;
while (top >= 2 && area(q[stk[top - 1]],q[stk[top]],q[i]) <= 0)
top--;
stk[++top] = i;
}
} 
京公网安备 11010502036488号