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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)

创建ASP.NET Core Web应用程序如果您使用的是VS2017请看 VS2017创建ASP.NET Core Web程序(三)在这个视频中我们将讨论可用的不同项目模板及其功能预制的项目模板有什么不同&#xff0c;哪些是可以使用的&#xff0c;以及他们的作用。在Visual Studio 2019中创建新的ASP.NET Cor…

ASP.NET Core 沉思录 - 结构化日志

在 《ASP.NET Core 沉思录 - Logging 的两种介入方法》中我们介绍了 ASP.NET Core 中日志的基本设计结构。这一次我们来观察日志记录的格式&#xff0c;并进一步考虑如何在应用程序中根据不同的需求选择不同的日志记录形式。太长不读&#xff1a;直接飞到文章最后 :-DMicrosoft…

为什么我们要做单元测试?(二)

引子当我第一篇博客发布&#xff0c;并被张善友老师的公众号转载之后&#xff0c;在公众号文章和博客园的留言中&#xff0c;许多开发者纷纷表示&#xff0c;单元测试作为企业行为&#xff0c;与实施的技术栈不同&#xff0c;不是开发者个人行为&#xff0c;实施单元测试花费的…

P4159 [SCOI2009] 迷路

P4159 [SCOI2009] 迷路 题意&#xff1a; 该有向图有 n 个节点&#xff0c;节点从 1 至 nn 编号&#xff0c;windy 从节点 1 出发&#xff0c;他必须恰好在 t 时刻到达节点 n。 现在给出该有向图(带边权)&#xff0c;你能告诉 windy 总共有多少种不同的路径吗&#xff1f; …

程序员修神之路--提高网站的吞吐量

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;有个事你还得帮我呀呦西&#xff0c;YY妹子&#xff0c;最近天这么热了&#xff0c;你怎么还穿这么多&#xff1f;苦笑一下.....前几天写了几个接口&#xff0c;领导让提高一下接口吞吐量这是你技术提高的大好机会呀可吞…

一份.NET 容器化的调查小结

小编在上个月在微信公众号“dotnet跨平台” 做了一个针对.NET 容器化的调查&#xff1a;.NET Core 容器化调查&#xff0c;参与人数702人&#xff0c;由于软件定义基础设施方兴未艾&#xff0c;编排和自动化领域kubernetes占据了主体地位&#xff0c;在平时的工作中和身边的同学…

P2148 [SDOI2009]ED

P2148 [SDOI2009]E&D 题意&#xff1a; 有2n堆石子&#xff0c;第2k-1堆和第2k堆是一组&#xff0c;现在两个人轮流操作&#xff0c;每次操作任选一组石子&#xff0c;然后将改组中的一堆石子移走&#xff0c;将另一堆式子分割成两堆&#xff0c;形成新的两堆石子&#x…

扒一扒.NET Core的环境配置提供程序

前言很久之前&#xff0c;在玩Docker的时候顺便扒了扒&#xff0c;最近&#xff0c;终于下定决心花了些时间整理并成文&#xff0c;希望能够给大家一些帮助。目录 .NET Core中的配置ASP.NET Core中的配置扒一扒环境变量提供程序为什么是“__”&#xff1f;“__”如何变成了“&…

[HNOI2016] 序列(线段树 + 莫队 + 倍增)

problem luogu-P3246 心路历程卡常历程问题存疑 一直在想莫队的做法。发现左右指针的移动对应一段左/右端点固定的子序列&#xff0c;然后可以一个数代表一段相同的贡献。 就开始求 lsti,nxtilst_i,nxt_ilsti​,nxti​ 了。 仔细想想需要找到 lstlsti<l≤lstilst_{lst_…

《从零开始学ASP.NET CORE MVC》:ASP.NET Core 中的 Main方法(5)

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core Web 项目文件ASP.NET Core 中的 Main方法一个开始专心写字的人在ASP.NET Core项目中&#xff0c;我们有一个名为Program.cs的文件。在这个文件中&#xff0c;我们有一个public static void Main&#…

.NET中的状态机库Stateless

标题&#xff1a;.NET中的状态机库Stateless 作者&#xff1a;Lamond Lu 地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10674018.html[1]介绍什么是状态机和状态模式状态机是一种用来进行对象建模的工具&#xff0c;它是一个有向图形&#xff0c;由一组节点和一组相应的转…

.net core webapi 前后端开发分离后的配置和部署

背景&#xff1a;现在越来越多的企业都采用了在开发上前后端分离&#xff0c;前后端开发上的分离有很多种&#xff0c;那么今天&#xff0c;我来分享一下项目中得的前后端分离。B/S Saas 项目&#xff1a;&#xff08;这个项目可以理解成个人中心&#xff0c;当然不止这么点功…

ASP.NET Core使用Jaeger实现分布式追踪

前言最近我们公司的部分.NET Core的项目接入了Jaeger&#xff0c;也算是稍微完善了一下.NET团队的技术栈。至于为什么选择Jaeger而不是Skywalking&#xff0c;这个问题我只能回答&#xff0c;大佬们说了算。前段时间也在CSharpCorner写过一篇类似的介绍Exploring Distributed T…

长沙开发者技术大会暨.NET技术社区成立大会倒数第13天

待你扬帆起航&#xff0c;一起精彩纷呈&#xff01;长沙开发者技术大会暨.NET技术社区成立大会倒数第13天&#xff01;2019年4月21日期待与你相聚在.NET技术社区&#xff01;我们今天会完成海报制作和报表表单&#xff0c;海报内容初步如下所示&#xff1a;活动信息 长沙开发者…

C#并行编程(1):理解并行

什么是并行并行是指两个或者多个事件在同一时刻发生。在程序运行中&#xff0c;并行指多个CPU核心同时执行不同的任务&#xff1b;对于单核心CPU,严格来说是没有程序并行的。并行是为了提高任务执行效率&#xff0c;更快的获取结果。与并发的区别&#xff1a;并发是指两个或者多…

P2163 [SHOI2007]园丁的烦恼(二维数点模板题)

P2163 [SHOI2007]园丁的烦恼 题意&#xff1a; 在一个二维平面内有一些点&#xff0c;给你一个左上角和右下角的点&#xff0c;问这个范围内有多少点 题解&#xff1a; 二维数点模板题 我们设F(a,b)表示以(0,0)为左下角&#xff0c;(a,b)为右上角的矩阵内有多少点 如图不难…

Orleans MultiClient 多个Silo复合客户端

介绍Orleans.MultiClient 是一个 Orleans 复合客户端&#xff0c;只需要简单配置就可以简单高效连接和请求 Orleans 服务。Orleans.MultiClient 可以轻松连接多个不同服务的 Orleans 服务,在请求 Orleans 时会根据请求的接口自动寻找 Orleans 客户端&#xff0c;使用者无需关心…

ASP.NET Core 进程内(InProcess)托管(6)《从零开始学ASP.NET CORE MVC》:

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core 中的 Main方法ASP.NET Core 进程内(InProcess)托管在这个视频中我们将讨论在ASP.NET Core中的进程内(InProcess)托管模型什么是Kestrel服务器当一个 ASP.NET Core 应用程序执行的时候&#xff0c;.NET…

约会安排 HDU - 4553

约会安排 HDU - 4553 题意&#xff1a; 题意又丑又长就不叙述了 题解&#xff1a; 这个题一开始理解错了。。。题目相当于是有三种情况占据时间&#xff0c;分别是学习&#xff0c;女神和屌丝&#xff0c;我们用不同的lazy来表示女神和屌丝&#xff0c;根据优先级去更新状态…

ML.NET机器学习、API容器化与Azure DevOps实践(一):简介

打算使用几篇文章介绍一下.NET下的机器学习框架ML.NET的具体应用&#xff0c;包括一些常用的业务场景、算法的选择、模型的训练以及RESTful API的创建、机器学习服务容器化&#xff0c;以及基于Azure DevOps的容器化部署等等相关的内容。如果你从来没有玩过机器学习&#xff0c…