Code: Select all
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define SIZE 100000
struct point{
int x,y;
point(){}
point(int _x,int _y):x(_x),y(_y){}
point operator-(point &p){point tmp(x-p.x,y-p.y);return tmp;}
friend int operator^(point p1,point p2){return p1.x*p2.y-p1.y*p2.x;}
bool operator<(point &p){return y<p.y || (y==p.y && x<p.x);}
};
vector<point> list;
point ref;
inline int cross_product(point &p0,point &p1,point &p2){
return (p1-p0)^(p2-p0);
}
inline int sq_distance(point &p1,point &p2){
return (p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y);
}
bool eqal(point &a,point &b){
return cross_product(ref,a,b)==0;
}
bool comp(point &a,point &b){
int cp=cross_product(ref,a,b);
return cp<0 || (cp==0 && sq_distance(ref,a)>sq_distance(ref,b));
}
int convex_hull(vector<point> &points,int n){
int i,top=0;
static int stack[SIZE];
for(i=1;i<n;i++)
if(points[i]<points[top])
top=i;
swap(points[top],points[0]);
ref=points[0];
sort(points.begin(),points.end(),comp);
points.erase(unique(points.begin()+1,points.end(),eqal),points.end());
n=points.size();
for(i=0;i<3;i++) stack[i]=i;
for(i=top=3;i<n;i++){
while(cross_product(points[i],points[stack[top-1]],points[stack[top-2]])>0)
top--;
stack[top++]=i;
}
for(i=1;i<top;i++)
points[i]=points[stack[i]];
return top;
}
void main(){
int p,i;
while(scanf("%d",&p)==1){
list.resize(p);
for(i=0;i<p;i++) scanf("%d%d",&list[i].x,&list[i].y);
p=convex_hull(list,p);
printf("%d\n",p);
}
}
Code: Select all
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:
In function `const struct point & __median<point, bool (*)(point &,
point &)>(const point &, const point &, const point &, bool (*)(point &,
point &))':
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:1304:
instantiated from `__introsort_loop<point *, point, int, bool (*)(point
&, point &)>(point *, point *, point *, int, bool (*)(point &, point &))'
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:1332:
instantiated from here
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:64:
conversion from `const point' to `point &' discards qualifiers
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:64:
conversion from `const point' to `point &' discards qualifiers
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:65:
conversion from `const point' to `point &' discards qualifiers
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:65:
conversion from `const point' to `point &' discards qualifiers
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:67:
conversion from `const point' to `point &' discards qualifiers
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:67:
conversion from `const point' to `point &' discards qualifiers
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:71:
conversion from `const point' to `point &' discards qualifiers
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:71:
conversion from `const point' to `point &' discards qualifiers
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:73:
conversion from `const point' to `point &' discards qualifiers
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3/stl_algo.h:73:
conversion from `const point' to `point &' discards qualifiers