题目链接:http://codeforces.com/gym/102279/problem/H
大致题意: 你在一个定点,你有个长度为R的钩子,有n个东西在其他点处,问你能勾到的东西的数量是多少?
思路:明明一道几何题,罗老板居然用gcd巧妙的A了,真是太强了。如果一件物品挡住了另一件物品,那么它是勾不到的。
首先将所有距离在R的点都拎出来,然后对于给定点进行极角排序,最后俩俩相邻比较即可确定答案。
AC代码:
1 #include<cmath> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 typedef long long ll; 6 const double eps = 1e-12; 7 const int maxn = 5e5+50; 8 int sgn(double x){ 9 if(fabs(x) < 0) return 0; 10 else return x < 0 ? -1 : 1; 11 } 12 struct Point{ 13 double x, y; 14 Point(){} 15 Point(double _x, double _y){ 16 x = _x, y = _y; 17 } 18 void input(){ 19 scanf("%lf%lf", &x, &y); 20 } 21 void output(){ 22 printf("%.2f %.2f",x ,y); 23 } 24 bool operator == (Point b) const{ 25 return sgn(x - b.x) == 0 && sgn(y - b.y) == 0; 26 } 27 bool operator < (Point b)const{ 28 return sgn(x - b.x) == 0 ? sgn(y - b.y < 0) : x < b.x; 29 } 30 Point operator - (const Point &b)const{ 31 return Point(x - b.x, y - b.y); 32 } 33 //叉积 34 double operator ^(const Point &b){ 35 return x * b.y - y * b.x; 36 } 37 //点积 38 double operator *(const Point &b){ 39 return x * b.x + y * b.y; 40 } 41 double distant(Point p){ 42 return hypot(x - p.x, y - p.y); 43 } 44 45 }; 46 Point p[maxn]; 47 struct cmp{ 48 Point p; 49 cmp(const Point &p0) {p = p0;} 50 bool operator()(const Point &aa, const Point &bb){ 51 Point a = aa, b = bb; 52 int d = sgn((a - p) ^ (b - p)); 53 if(d == 0){ 54 return sgn(a.distant(p) - b.distant(p)) < 0; 55 } 56 return d > 0; 57 } 58 }; 59 60 61 int main() 62 { 63 int n; 64 double x0, y0, r; 65 double x, y; 66 scanf("%lf %lf %lf %d",&x0, &y0, &r, &n); 67 int m = 0; 68 Point s = Point(x0, y0), e; 69 while(n--){ 70 e.input(); 71 //printf("d = %.12f\n",e.distant(s) - r); 72 if(e.distant(s) - r <= 0) 73 p[m++] = e; 74 } 75 int ans = 0; 76 sort(p, p + m, cmp(s)); 77 for(int i = 0;i < m;i++) 78 { 79 if(i == 0 ) ans++; 80 else if(((p[i] - s) ^ (p[i-1] - s)) != 0.0) 81 ans++; 82 } 83 printf("%d\n",ans); 84 return 0; 85 }
附罗老板的神奇gcd:(明显代码长度短很多啊orz)