日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

H - Square Card HDU - 7063

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 H - Square Card HDU - 7063 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

H - Square Card HDU - 7063

題意:

有兩個圓形區域,一個是得分區域,一個是獲得獎金區域,現在你有一個邊長為a的正方形,當正方形在如果在某一時刻它嚴格在圓形范圍內,才算合法。
問把牌扔到任意的位置被得分和同時獲得獎金的可能性與被得分的可能性的比率是多少

題解:

我第一反應是想直接rand得結果,突然發現想多了,其實就是求兩個圓相交面積再比得分區域面積就行。但是注意題目要求牌必須完全在園內,也就是圓心所在位置并不是整個圓,而是比圓小一圈的情況,所以需要求新的半徑

newr=sqrt(rr-aa/4)-a/2
求出兩個新的r,然后相交求圓面積,做比就是結果

代碼:

#include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; template <typename T> inline void read(T& x) {T f= 1;x= 0;char ch= getchar();while (0 == isdigit(ch)) {if (ch == '-')f= -1;ch= getchar();}while (0 != isdigit(ch))x= (x << 1) + (x << 3) + ch - '0', ch= getchar();x*= f; } template <typename T> inline void write(T x) {if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0'); } void rd_test() { #ifdef ONLINE_JUDGE #elsestartTime= clock();freopen("in.txt", "r", stdin); #endif } void Time_test() { #ifdef ONLINE_JUDGE #elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } // `計算幾何模板` const double eps= 1e-8; const double inf= 1e20; const double pi= acos(-1.0); const int maxp= 1010; //`Compares a double to zero` int sgn(double x) {if (fabs(x) < eps)return 0;if (x < 0)return -1;elsereturn 1; } //square of a double inline double sqr(double x) {return x * x; } /** Point* Point() - Empty constructor* Point(double _x,double _y) - constructor* input() - double input* output() - %.2f output* operator == - compares x and y* operator < - compares first by x, then by y* operator - - return new Point after subtracting curresponging x and y* operator ^ - cross product of 2d points* operator * - dot product* len() - gives length from origin* len2() - gives square of length from origin* distance(Point p) - gives distance from p* operator + Point b - returns new Point after adding curresponging x and y* operator * double k - returns new Point after multiplieing x and y by k* operator / double k - returns new Point after divideing x and y by k* rad(Point a,Point b)- returns the angle of Point a and Point b from this Point* trunc(double r) - return Point that if truncated the distance from center to r* rotleft() - returns 90 degree ccw rotated point* rotright() - returns 90 degree cw rotated point* rotate(Point p,double angle) - returns Point after rotateing the Point centering at p by angle radian ccw*/ struct Point {double x, y;Point(){}Point(double _x, double _y){x= _x;y= _y;}void input(){scanf("%lf%lf", &x, &y);}void output(){printf("%.2f %.2f\n", x, y);}bool operator==(Point b) const{return sgn(x - b.x) == 0 && sgn(y - b.y) == 0;}bool operator<(Point b) const{return sgn(x - b.x) == 0 ? sgn(y - b.y) < 0 : x < b.x;}Point operator-(const Point& b) const{return Point(x - b.x, y - b.y);}//叉積double operator^(const Point& b) const{return x * b.y - y * b.x;}//點積double operator*(const Point& b) const{return x * b.x + y * b.y;}//返回長度double len(){return hypot(x, y); //庫函數}//返回長度的平方double len2(){return x * x + y * y;}//返回兩點的距離double distance(Point p){return hypot(x - p.x, y - p.y);}Point operator+(const Point& b) const{return Point(x + b.x, y + b.y);}Point operator*(const double& k) const{return Point(x * k, y * k);}Point operator/(const double& k) const{return Point(x / k, y / k);}//`計算pa 和 pb 的夾角`//`就是求這個點看a,b 所成的夾角`//`測試 LightOJ1203`double rad(Point a, Point b){Point p= *this;return fabs(atan2(fabs((a - p) ^ (b - p)), (a - p) * (b - p)));}//`化為長度為r的向量`Point trunc(double r){double l= len();if (!sgn(l))return *this;r/= l;return Point(x * r, y * r);}//`逆時針旋轉90度`Point rotleft(){return Point(-y, x);}//`順時針旋轉90度`Point rotright(){return Point(y, -x);}//`繞著p點逆時針旋轉angle`Point rotate(Point p, double angle){Point v= (*this) - p;double c= cos(angle), s= sin(angle);return Point(p.x + v.x * c - v.y * s, p.y + v.x * s + v.y * c);} }; /** Stores two points* Line() - Empty constructor* Line(Point _s,Point _e) - Line through _s and _e* operator == - checks if two points are same* Line(Point p,double angle) - one end p , another end at angle degree* Line(double a,double b,double c) - Line of equation ax + by + c = 0* input() - inputs s and e* adjust() - orders in such a way that s < e* length() - distance of se* angle() - return 0 <= angle < pi* relation(Point p) - 3 if point is on line* 1 if point on the left of line* 2 if point on the right of line* pointonseg(double p) - return true if point on segment* parallel(Line v) - return true if they are parallel* segcrossseg(Line v) - returns 0 if does not intersect* returns 1 if non-standard intersection* returns 2 if intersects* linecrossseg(Line v) - line and seg* linecrossline(Line v) - 0 if parallel* 1 if coincides* 2 if intersects* crosspoint(Line v) - returns intersection point* dispointtoline(Point p) - distance from point p to the line* dispointtoseg(Point p) - distance from p to the segment* dissegtoseg(Line v) - distance of two segment* lineprog(Point p) - returns projected point p on se line* symmetrypoint(Point p) - returns reflection point of p over se**/ struct Line {Point s, e;Line(){}Line(Point _s, Point _e){s= _s;e= _e;}bool operator==(Line v){return (s == v.s) && (e == v.e);}//`根據一個點和傾斜角angle確定直線,0<=angle<pi`Line(Point p, double angle){s= p;if (sgn(angle - pi / 2) == 0) {e= (s + Point(0, 1));}else {e= (s + Point(1, tan(angle)));}}//ax+by+c=0Line(double a, double b, double c){if (sgn(a) == 0) {s= Point(0, -c / b);e= Point(1, -c / b);}else if (sgn(b) == 0) {s= Point(-c / a, 0);e= Point(-c / a, 1);}else {s= Point(0, -c / b);e= Point(1, (-c - a) / b);}}void input(){s.input();e.input();}void adjust(){if (e < s)swap(s, e);}//求線段長度double length(){return s.distance(e);}//`返回直線傾斜角 0<=angle<pi`double angle(){double k= atan2(e.y - s.y, e.x - s.x);if (sgn(k) < 0)k+= pi;if (sgn(k - pi) == 0)k-= pi;return k;}//`點和直線關系`//`1 在左側`//`2 在右側`//`3 在直線上`int relation(Point p){int c= sgn((p - s) ^ (e - s));if (c < 0)return 1;else if (c > 0)return 2;elsereturn 3;}// 點在線段上的判斷bool pointonseg(Point p){return sgn((p - s) ^ (e - s)) == 0 && sgn((p - s) * (p - e)) <= 0;}//`兩向量平行(對應直線平行或重合)`bool parallel(Line v){return sgn((e - s) ^ (v.e - v.s)) == 0;}//`兩線段相交判斷`//`2 規范相交`//`1 非規范相交`//`0 不相交`int segcrossseg(Line v){int d1= sgn((e - s) ^ (v.s - s));int d2= sgn((e - s) ^ (v.e - s));int d3= sgn((v.e - v.s) ^ (s - v.s));int d4= sgn((v.e - v.s) ^ (e - v.s));if ((d1 ^ d2) == -2 && (d3 ^ d4) == -2)return 2;return (d1 == 0 && sgn((v.s - s) * (v.s - e)) <= 0) || (d2 == 0 && sgn((v.e - s) * (v.e - e)) <= 0) || (d3 == 0 && sgn((s - v.s) * (s - v.e)) <= 0)|| (d4 == 0 && sgn((e - v.s) * (e - v.e)) <= 0);}//`直線和線段相交判斷`//`-*this line -v seg`//`2 規范相交`//`1 非規范相交`//`0 不相交`int linecrossseg(Line v){int d1= sgn((e - s) ^ (v.s - s));int d2= sgn((e - s) ^ (v.e - s));if ((d1 ^ d2) == -2)return 2;return (d1 == 0 || d2 == 0);}//`兩直線關系`//`0 平行`//`1 重合`//`2 相交`int linecrossline(Line v){if ((*this).parallel(v))return v.relation(s) == 3;return 2;}//`求兩直線的交點`//`要保證兩直線不平行或重合`Point crosspoint(Line v){double a1= (v.e - v.s) ^ (s - v.s);double a2= (v.e - v.s) ^ (e - v.s);return Point((s.x * a2 - e.x * a1) / (a2 - a1), (s.y * a2 - e.y * a1) / (a2 - a1));}//點到直線的距離double dispointtoline(Point p){return fabs((p - s) ^ (e - s)) / length();}//點到線段的距離double dispointtoseg(Point p){if (sgn((p - s) * (e - s)) < 0 || sgn((p - e) * (s - e)) < 0)return min(p.distance(s), p.distance(e));return dispointtoline(p);}//`返回線段到線段的距離`//`前提是兩線段不相交,相交距離就是0了`double dissegtoseg(Line v){return min(min(dispointtoseg(v.s), dispointtoseg(v.e)), min(v.dispointtoseg(s), v.dispointtoseg(e)));}//`返回點p在直線上的投影`Point lineprog(Point p){return s + (((e - s) * ((e - s) * (p - s))) / ((e - s).len2()));}//`返回點p關于直線的對稱點`Point symmetrypoint(Point p){Point q= lineprog(p);return Point(2 * q.x - p.x, 2 * q.y - p.y);} }; //圓 struct circle {Point p; //圓心double r; //半徑circle(){}circle(Point _p, double _r){p= _p;r= _r;}circle(double x, double y, double _r){p= Point(x, y);r= _r;}//`三角形的外接圓`//`需要Point的+ / rotate() 以及Line的crosspoint()`//`利用兩條邊的中垂線得到圓心`//`測試:UVA12304`circle(Point a, Point b, Point c){Line u= Line((a + b) / 2, ((a + b) / 2) + ((b - a).rotleft()));Line v= Line((b + c) / 2, ((b + c) / 2) + ((c - b).rotleft()));p= u.crosspoint(v);r= p.distance(a);}//`三角形的內切圓`//`參數bool t沒有作用,只是為了和上面外接圓函數區別`//`測試:UVA12304`circle(Point a, Point b, Point c, bool t){Line u, v;double m= atan2(b.y - a.y, b.x - a.x), n= atan2(c.y - a.y, c.x - a.x);u.s= a;u.e= u.s + Point(cos((n + m) / 2), sin((n + m) / 2));v.s= b;m= atan2(a.y - b.y, a.x - b.x), n= atan2(c.y - b.y, c.x - b.x);v.e= v.s + Point(cos((n + m) / 2), sin((n + m) / 2));p= u.crosspoint(v);r= Line(a, b).dispointtoseg(p);}//輸入void input(){p.input();scanf("%lf", &r);}//輸出void output(){printf("%.2lf %.2lf %.2lf\n", p.x, p.y, r);}bool operator==(circle v){return (p == v.p) && sgn(r - v.r) == 0;}bool operator<(circle v) const{return ((p < v.p) || ((p == v.p) && sgn(r - v.r) < 0));}//面積double area(){return pi * r * r;}//周長double circumference(){return 2 * pi * r;}//`點和圓的關系`//`0 圓外`//`1 圓上`//`2 圓內`int relation(Point b){double dst= b.distance(p);if (sgn(dst - r) < 0)return 2;else if (sgn(dst - r) == 0)return 1;return 0;}//`線段和圓的關系`//`比較的是圓心到線段的距離和半徑的關系`int relationseg(Line v){double dst= v.dispointtoseg(p);if (sgn(dst - r) < 0)return 2;else if (sgn(dst - r) == 0)return 1;return 0;}//`直線和圓的關系`//`比較的是圓心到直線的距離和半徑的關系`int relationline(Line v){double dst= v.dispointtoline(p);if (sgn(dst - r) < 0)return 2;else if (sgn(dst - r) == 0)return 1;return 0;}//`兩圓的關系`//`5 相離`//`4 外切`//`3 相交`//`2 內切`//`1 內含`//`需要Point的distance`//`測試:UVA12304`int relationcircle(circle v){double d= p.distance(v.p);if (sgn(d - r - v.r) > 0)return 5;if (sgn(d - r - v.r) == 0)return 4;double l= fabs(r - v.r);if (sgn(d - r - v.r) < 0 && sgn(d - l) > 0)return 3;if (sgn(d - l) == 0)return 2;if (sgn(d - l) < 0)return 1;}//`求兩個圓的交點,返回0表示沒有交點,返回1是一個交點,2是兩個交點`//`需要relationcircle`//`測試:UVA12304`int pointcrosscircle(circle v, Point& p1, Point& p2){int rel= relationcircle(v);if (rel == 1 || rel == 5)return 0;double d= p.distance(v.p);double l= (d * d + r * r - v.r * v.r) / (2 * d);double h= sqrt(r * r - l * l);Point tmp= p + (v.p - p).trunc(l);p1= tmp + ((v.p - p).rotleft().trunc(h));p2= tmp + ((v.p - p).rotright().trunc(h));if (rel == 2 || rel == 4)return 1;return 2;}//`求直線和圓的交點,返回交點個數`int pointcrossline(Line v, Point& p1, Point& p2){if (!(*this).relationline(v))return 0;Point a= v.lineprog(p);double d= v.dispointtoline(p);d= sqrt(r * r - d * d);if (sgn(d) == 0) {p1= a;p2= a;return 1;}p1= a + (v.e - v.s).trunc(d);p2= a - (v.e - v.s).trunc(d);return 2;}//`得到過a,b兩點,半徑為r1的兩個圓`int gercircle(Point a, Point b, double r1, circle& c1, circle& c2){circle x(a, r1), y(b, r1);int t= x.pointcrosscircle(y, c1.p, c2.p);if (!t)return 0;c1.r= c2.r= r;return t;}//`得到與直線u相切,過點q,半徑為r1的圓`//`測試:UVA12304`int getcircle(Line u, Point q, double r1, circle& c1, circle& c2){double dis= u.dispointtoline(q);if (sgn(dis - r1 * 2) > 0)return 0;if (sgn(dis) == 0) {c1.p= q + ((u.e - u.s).rotleft().trunc(r1));c2.p= q + ((u.e - u.s).rotright().trunc(r1));c1.r= c2.r= r1;return 2;}Line u1= Line((u.s + (u.e - u.s).rotleft().trunc(r1)), (u.e + (u.e - u.s).rotleft().trunc(r1)));Line u2= Line((u.s + (u.e - u.s).rotright().trunc(r1)), (u.e + (u.e - u.s).rotright().trunc(r1)));circle cc= circle(q, r1);Point p1, p2;if (!cc.pointcrossline(u1, p1, p2))cc.pointcrossline(u2, p1, p2);c1= circle(p1, r1);if (p1 == p2) {c2= c1;return 1;}c2= circle(p2, r1);return 2;}//`同時與直線u,v相切,半徑為r1的圓`//`測試:UVA12304`int getcircle(Line u, Line v, double r1, circle& c1, circle& c2, circle& c3, circle& c4){if (u.parallel(v))return 0; //兩直線平行Line u1= Line(u.s + (u.e - u.s).rotleft().trunc(r1), u.e + (u.e - u.s).rotleft().trunc(r1));Line u2= Line(u.s + (u.e - u.s).rotright().trunc(r1), u.e + (u.e - u.s).rotright().trunc(r1));Line v1= Line(v.s + (v.e - v.s).rotleft().trunc(r1), v.e + (v.e - v.s).rotleft().trunc(r1));Line v2= Line(v.s + (v.e - v.s).rotright().trunc(r1), v.e + (v.e - v.s).rotright().trunc(r1));c1.r= c2.r= c3.r= c4.r= r1;c1.p= u1.crosspoint(v1);c2.p= u1.crosspoint(v2);c3.p= u2.crosspoint(v1);c4.p= u2.crosspoint(v2);return 4;}//`同時與不相交圓cx,cy相切,半徑為r1的圓`//`測試:UVA12304`int getcircle(circle cx, circle cy, double r1, circle& c1, circle& c2){circle x(cx.p, r1 + cx.r), y(cy.p, r1 + cy.r);int t= x.pointcrosscircle(y, c1.p, c2.p);if (!t)return 0;c1.r= c2.r= r1;return t;}//`過一點作圓的切線(先判斷點和圓的關系)`//`測試:UVA12304`int tangentline(Point q, Line& u, Line& v){int x= relation(q);if (x == 2)return 0;if (x == 1) {u= Line(q, q + (q - p).rotleft());v= u;return 1;}double d= p.distance(q);double l= r * r / d;double h= sqrt(r * r - l * l);u= Line(q, p + ((q - p).trunc(l) + (q - p).rotleft().trunc(h)));v= Line(q, p + ((q - p).trunc(l) + (q - p).rotright().trunc(h)));return 2;}//`求兩圓相交的面積`double areacircle(circle v){int rel= relationcircle(v);if (rel >= 4)return 0.0;if (rel <= 2)return min(area(), v.area());double d= p.distance(v.p);double hf= (r + v.r + d) / 2.0;double ss= 2 * sqrt(hf * (hf - r) * (hf - v.r) * (hf - d));double a1= acos((r * r + d * d - v.r * v.r) / (2.0 * r * d));a1= a1 * r * r;double a2= acos((v.r * v.r + d * d - r * r) / (2.0 * v.r * d));a2= a2 * v.r * v.r;return a1 + a2 - ss;}//`求圓和三角形pab的相交面積`//`測試:POJ3675 HDU3982 HDU2892`double areatriangle(Point a, Point b){if (sgn((p - a) ^ (p - b)) == 0)return 0.0;Point q[5];int len= 0;q[len++]= a;Line l(a, b);Point p1, p2;if (pointcrossline(l, q[1], q[2]) == 2) {if (sgn((a - q[1]) * (b - q[1])) < 0)q[len++]= q[1];if (sgn((a - q[2]) * (b - q[2])) < 0)q[len++]= q[2];}q[len++]= b;if (len == 4 && sgn((q[0] - q[1]) * (q[2] - q[1])) > 0)swap(q[1], q[2]);double res= 0;for (int i= 0; i < len - 1; i++) {if (relation(q[i]) == 0 || relation(q[i + 1]) == 0) {double arg= p.rad(q[i], q[i + 1]);res+= r * r * arg / 2.0;}else {res+= fabs((q[i] - p) ^ (q[i + 1] - p)) / 2.0;}}return res;} };/** n,p Line l for each side* input(int _n) - inputs _n size polygon* add(Point q) - adds a point at end of the list* getline() - populates line array* cmp - comparision in convex_hull order* norm() - sorting in convex_hull order* getconvex(polygon &convex) - returns convex hull in convex* Graham(polygon &convex) - returns convex hull in convex* isconvex() - checks if convex* relationpoint(Point q) - returns 3 if q is a vertex* 2 if on a side* 1 if inside* 0 if outside* convexcut(Line u,polygon &po) - left side of u in po* gercircumference() - returns side length* getarea() - returns area* getdir() - returns 0 for cw, 1 for ccw* getbarycentre() - returns barycenter**/ struct polygon {int n;Point p[maxp];Line l[maxp];void input(int _n){n= _n;for (int i= 0; i < n; i++)p[i].input();}void add(Point q){p[n++]= q;}void getline(){for (int i= 0; i < n; i++) {l[i]= Line(p[i], p[(i + 1) % n]);}}struct cmp{Point p;cmp(const Point& p0){p= p0;}bool operator()(const Point& aa, const Point& bb){Point a= aa, b= bb;int d= sgn((a - p) ^ (b - p));if (d == 0) {return sgn(a.distance(p) - b.distance(p)) < 0;}return d > 0;}};//`進行極角排序`//`首先需要找到最左下角的點`//`需要重載號好Point的 < 操作符(min函數要用) `void norm(){Point mi= p[0];for (int i= 1; i < n; i++)mi= min(mi, p[i]);sort(p, p + n, cmp(mi));}//`得到凸包`//`得到的凸包里面的點編號是0$\sim$n-1的`//`兩種凸包的方法`//`注意如果有影響,要特判下所有點共點,或者共線的特殊情況`//`測試 LightOJ1203 LightOJ1239`void getconvex(polygon& convex){sort(p, p + n);convex.n= n;for (int i= 0; i < min(n, 2); i++) {convex.p[i]= p[i];}if (convex.n == 2 && (convex.p[0] == convex.p[1]))convex.n--; //特判if (n <= 2)return;int& top= convex.n;top= 1;for (int i= 2; i < n; i++) {while (top && sgn((convex.p[top] - p[i]) ^ (convex.p[top - 1] - p[i])) <= 0)top--;convex.p[++top]= p[i];}int temp= top;convex.p[++top]= p[n - 2];for (int i= n - 3; i >= 0; i--) {while (top != temp && sgn((convex.p[top] - p[i]) ^ (convex.p[top - 1] - p[i])) <= 0)top--;convex.p[++top]= p[i];}if (convex.n == 2 && (convex.p[0] == convex.p[1]))convex.n--; //特判convex.norm(); //`原來得到的是順時針的點,排序后逆時針`}//`得到凸包的另外一種方法`//`測試 LightOJ1203 LightOJ1239`void Graham(polygon& convex){norm();int& top= convex.n;top= 0;if (n == 1) {top= 1;convex.p[0]= p[0];return;}if (n == 2) {top= 2;convex.p[0]= p[0];convex.p[1]= p[1];if (convex.p[0] == convex.p[1])top--;return;}convex.p[0]= p[0];convex.p[1]= p[1];top= 2;for (int i= 2; i < n; i++) {while (top > 1 && sgn((convex.p[top - 1] - convex.p[top - 2]) ^ (p[i] - convex.p[top - 2])) <= 0)top--;convex.p[top++]= p[i];}if (convex.n == 2 && (convex.p[0] == convex.p[1]))convex.n--; //特判}//`判斷是不是凸的`bool isconvex(){bool s[2];memset(s, false, sizeof(s));for (int i= 0; i < n; i++) {int j= (i + 1) % n;int k= (j + 1) % n;s[sgn((p[j] - p[i]) ^ (p[k] - p[i])) + 1]= true;if (s[0] && s[2])return false;}return true;}//`判斷點和任意多邊形的關系`//` 3 點上`//` 2 邊上`//` 1 內部`//` 0 外部`int relationpoint(Point q){for (int i= 0; i < n; i++) {if (p[i] == q)return 3;}getline();for (int i= 0; i < n; i++) {if (l[i].pointonseg(q))return 2;}int cnt= 0;for (int i= 0; i < n; i++) {int j= (i + 1) % n;int k= sgn((q - p[j]) ^ (p[i] - p[j]));int u= sgn(p[i].y - q.y);int v= sgn(p[j].y - q.y);if (k > 0 && u < 0 && v >= 0)cnt++;if (k < 0 && v < 0 && u >= 0)cnt--;}return cnt != 0;}//`直線u切割凸多邊形左側`//`注意直線方向`//`測試:HDU3982`void convexcut(Line u, polygon& po){int& top= po.n; //注意引用top= 0;for (int i= 0; i < n; i++) {int d1= sgn((u.e - u.s) ^ (p[i] - u.s));int d2= sgn((u.e - u.s) ^ (p[(i + 1) % n] - u.s));if (d1 >= 0)po.p[top++]= p[i];if (d1 * d2 < 0)po.p[top++]= u.crosspoint(Line(p[i], p[(i + 1) % n]));}}//`得到周長`//`測試 LightOJ1239`double getcircumference(){double sum= 0;for (int i= 0; i < n; i++) {sum+= p[i].distance(p[(i + 1) % n]);}return sum;}//`得到面積`double getarea(){double sum= 0;for (int i= 0; i < n; i++) {sum+= (p[i] ^ p[(i + 1) % n]);}return fabs(sum) / 2;}//`得到方向`//` 1 表示逆時針,0表示順時針`bool getdir(){double sum= 0;for (int i= 0; i < n; i++)sum+= (p[i] ^ p[(i + 1) % n]);if (sgn(sum) > 0)return 1;return 0;}//`得到重心`Point getbarycentre(){Point ret(0, 0);double area= 0;for (int i= 1; i < n - 1; i++) {double tmp= (p[i] - p[0]) ^ (p[i + 1] - p[0]);if (sgn(tmp) == 0)continue;area+= tmp;ret.x+= (p[0].x + p[i].x + p[i + 1].x) / 3 * tmp;ret.y+= (p[0].y + p[i].y + p[i + 1].y) / 3 * tmp;}if (sgn(area))ret= ret / area;return ret;}//`多邊形和圓交的面積`//`測試:POJ3675 HDU3982 HDU2892`double areacircle(circle c){double ans= 0;for (int i= 0; i < n; i++) {int j= (i + 1) % n;if (sgn((p[j] - c.p) ^ (p[i] - c.p)) >= 0)ans+= c.areatriangle(p[i], p[j]);elseans-= c.areatriangle(p[i], p[j]);}return fabs(ans);}//`多邊形和圓關系`//` 2 圓完全在多邊形內`//` 1 圓在多邊形里面,碰到了多邊形邊界`//` 0 其它`int relationcircle(circle c){getline();int x= 2;if (relationpoint(c.p) != 1)return 0; //圓心不在內部for (int i= 0; i < n; i++) {if (c.relationseg(l[i]) == 2)return 0;if (c.relationseg(l[i]) == 1)x= 1;}return x;} }; //`AB X AC` double cross(Point A, Point B, Point C) {return (B - A) ^ (C - A); }int main() {//rd_test();int t;read(t);while (t--) {double r1, x1, y1;double r2, x2, y2;double a;scanf("%lf%lf%lf", &r1, &x1, &y1);scanf("%lf%lf%lf", &r2, &x2, &y2);scanf("%lf", &a);double newr1, newr2;newr1= sqrt(r1 * r1 - a * a / 4) - a / 2;newr2= sqrt(r2 * r2 - a * a / 4) - a / 2;circle A(x1, y1, newr1);circle B(x2, y2, newr2);double sum1= A.areacircle(B);double sum2= A.area();printf("%.6lf\n", sum1 / sum2);}//Time_test(); }

總結

以上是生活随笔為你收集整理的H - Square Card HDU - 7063的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。