本来弄了个独立博客,想用那个的,不习惯,还是用博客园吧。那个留着吓弄吧。
在家了4天,玩了3天半,那半天学会凸包,临走回家,拿了两本书,C++ primer和黑书,还有浙大的模板,天天玩,这是要跪的节奏啊。
学凸包,黑书上讲的特好。。。
凸包,原来以为听高端的。其实,也不难的。看着黑书,和浙大模板,把POJ计划上凸包两个题,秒掉应该是没有问题的。我看那个版本的浙大模板有点问题,没有考虑所有的点都共线的情况。
期间一场CF,让我给睡过去了,scf在家做了,我好惭愧。。。回家了就是想睡觉额。。。
POJ 2187 Beauty Contest 凸包之后,求最远点距离平方,1113跟这个一模一样,就是加上一个圆的周长(智商拙计额)。。
1 #include <iostream>//POJ 2187 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 #define LL __int64 8 #define N 50001 9 #define eps 1e-6 10 struct Point 11 { 12 int x,y; 13 } p[N]; 14 int s[N]; 15 int top,n; 16 int det(int x1,int y1,int x2,int y2) 17 { 18 return x1*y2 - x2*y1; 19 } 20 int cross(Point a,Point b,Point c)//线段ac与线段bc叉积 21 { 22 return det(a.x - c.x,a.y - c.y,b.x - c.x,b.y - c.y); 23 } 24 int dis(Point a,Point b) 25 { 26 return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); 27 } 28 bool cmp(Point a,Point b) 29 { 30 double t; 31 t = cross(a,b,p[0]); 32 if(t > 0||(t == 0&&dis(a,p[0]) < dis(b,p[0]))) 33 return true; 34 else 35 return false; 36 } 37 38 int main() 39 { 40 int i,maxz,j; 41 Point temp; 42 scanf("%d",&n); 43 for(i = 0; i < n; i ++) 44 { 45 scanf("%d%d",&p[i].x,&p[i].y); 46 if((p[i].y < p[0].y)||(p[i].y == p[0].y&&p[i].x < p[0].x)) 47 { 48 temp = p[i]; 49 p[i] = p[0]; 50 p[0] = temp; 51 } 52 } 53 sort(p+1,p+n,cmp); 54 for(i = 0; i < 3; i ++) 55 { 56 s[i] = i; 57 } 58 top = 2; 59 for(i = 3; i < n; i ++) 60 { 61 while(top >= 1&&cross(p[i],p[s[top]],p[s[top-1]]) >= 0) 62 top -- ; 63 s[++top] = i; 64 } 65 maxz = 0; 66 for(i = 0;i <= top;i ++) 67 { 68 for(j = 0;j <= top;j ++) 69 { 70 if(maxz < dis(p[s[i]],p[s[j]])) 71 maxz = dis(p[s[i]],p[s[j]]); 72 } 73 } 74 printf("%d\n",maxz); 75 return 0; 76 }