标签:des style blog color os io strong for
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 2523 | Accepted: 1045 |
Description
Input
Output
Sample Input
10.0 10.0 Colder 10.0 0.0 Hotter 0.0 0.0 Colder 10.0 10.0 Hotter
Sample Output
50.00 37.50 12.50 0.00
题意:在(0,0)到(10,10)的范围内,还在藏在某个点,另一个人从起点出发,每走到一个点,如果离藏匿点近了就是“Hotter”,如果远了就是“Colder”,否则就是“Same”
对于走的每个点,输出可能藏匿的面积大小。
思路: 可以转化为 aX+bY+c 与0的大小比较,因此可以用半平面交求解,每次找出中点和中垂线即可。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> using namespace std; #define REP(_,a,b) for(int _ = (a); _ < (b); _++) #define sz(s) (int)((s).size()) typedef long long ll; const double eps = 1e-9; const int maxn = 200; struct Point{ double x,y; Point(double x=0.0,double y = 0.0):x(x),y(y){} }; vector<Point> vP; Point poly[maxn]; typedef Point Vector; struct Line { Point P; Vector v; double ang; Line(){} Line(Point P,Vector v):P(P),v(v){ ang = atan2(v.y,v.x); } bool operator <(const Line&L) const{ return ang < L.ang; } }; Line L[maxn]; int lcnt; Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); } Vector operator - (Vector A,Vector B){ return Vector(A.x-B.x,A.y-B.y); } Vector operator * (Vector A,double p){ return Vector(A.x*p,A.y*p); } Vector operator / (Vector A,double p){ return Vector(A.x/p,A.y/p); } bool operator < (const Point &a,const Point &b){ return a.x < b.x || (a.x==a.y && a.y < b.y); } int dcmp(double x){ if(fabs(x) < eps) return 0; else return x < 0? -1:1; } bool operator == (const Point &a,const Point &b){ return dcmp(a.x-b.x)==0&& dcmp(a.y-b.y)==0; } double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;} double Length(Vector A) {return sqrt(Dot(A,A));} double Angle(Vector A,Vector B) {return acos(Dot(A,B)/Length(A)/Length(B));} double Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x;} Vector Rotate(Vector A,double rad) {return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad)); } Vector Normal(Vector A) { double L = Length(A); return Vector(-A.y/L,A.x/L); } bool OnLeft(Line L,Point p){ return Cross(L.v,p-L.P) > 0; } Point GetIntersection(Line a,Line b){ Vector u = a.P-b.P; double t = Cross(b.v,u) / Cross(a.v,b.v); return a.P+a.v*t; } int HalfplaneIntersection(Line* L,int n,Point* poly){ sort(L,L+n); int first,last; Point *p = new Point[n]; Line *q = new Line[n]; q[first=last=0] = L[0]; for(int i = 1; i < n; i++){ while(first < last && !OnLeft(L[i],p[last-1])) last--; while(first < last && !OnLeft(L[i],p[first])) first++; q[++last] = L[i]; if(fabs(Cross(q[last].v,q[last-1].v))<eps) { last--; if(OnLeft(q[last],L[i].P)) q[last] = L[i]; } if(first<last) p[last-1] = GetIntersection(q[last-1],q[last]); } while(first < last && !OnLeft(q[first],p[last-1])) last--; if(last - first <=1) return 0; p[last] = GetIntersection(q[last],q[first]); int m = 0; for(int i = first; i <= last; i++) poly[m++] = p[i]; return m; } void init(){ vP.clear(); lcnt = 0; vP.push_back(Point(0,0)); vP.push_back(Point(10,0)); vP.push_back(Point(10,10)); vP.push_back(Point(0,10)); int n = sz(vP); #define next(i) ((i)+1)%n REP(_,0,n){ L[_] = Line(vP[_],vP[next(_)]-vP[_]); lcnt++; } } int main(){ double x,y; string st; init(); Point pre = Point(0,0),cur; bool flag = true; while(cin >> x >> y >> st){ if(!flag){ printf("0.00\n"); continue; } cur = Point(x,y); if(st[0]=='S'){ printf("0.00\n"); flag = false; continue; }else if(st[0]=='H'){ L[lcnt++] = Line((pre+cur)/2,Normal(pre-cur)) ; }else{ L[lcnt++] = Line((pre+cur)/2,Normal(cur-pre)); } pre = Point(x,y); int m = HalfplaneIntersection(L,lcnt,poly); if(m==0){ printf("0.00\n"); flag = false; }else{ #define next(i) ((i)+1)%m double area = 0.0; REP(_,0,m) { area += Cross(poly[_],poly[next(_)])/2; } printf("%.2f\n",fabs(area)); } } return 0; }
POJ2540-Hotter Colder(半平面交),布布扣,bubuko.com
标签:des style blog color os io strong for
原文地址:http://blog.csdn.net/mowayao/article/details/38711623