时间:2016-04-16 20:06:06 星期六
题目编号:[2016-04-16][URAL][2067][Friends and Berries]
题目大意:给定n个点的坐标,问 d(u,v)⩾d(u,v)+d(v,w),d(w,v)2∀w, 的点有多少对
分析:
- 上面等式化简之和可以得到 类似 a⩾b+c, 有多少种情况 .
- 又已知三角形中 b+c>a,所以满足上式的三点一定共线
- 扩展到题目的n个点,那么必须满足两个条件:
- 所以题目就变成了求n个点是否共线,共线就把最外面的两个点的编号输出
遇到的问题:
- 重载 < 运算的时候,打错字母 x == a.y ,然后就呵呵~
- 如果使用向量成比例来计算,要注意讨论分母为0的情况,即有一个坐标为0
#include<cstdio>#include<algorithm>using namespace std;const int maxn = 2 * 1E5 + 10;struct Point { int x,y,id; Point(int a = 0 , int b = 0):x(a),y(b){}; bool operator < (const Point & a)const{ return x < a.x || (x == a.x && y < a.y); } Point operator - (const Point & a)const{ return Point(x - a.x,y-a.y); } int operator ^ (const Point & a)const{ return x*a.y - y*a.x; }}p[maxn];int main(){ int n; scanf("%d",&n); for(int i = 0 ; i < n ; ++i){ scanf("%d%d",&p[i].x, &p[i].y); p[i].id = i + 1; } int flg = 1; sort(p,p+n); Point tmp = p[1] - p[0]; for(int i = 2 ; i < n ; ++i){ if((p[i] - p[0])^tmp){ flg = 0;break; } } if(flg) printf("1\n%d %d\n",p[0].id, p[n - 1].id); else printf("0\n"); return 0;}