题意:如题

思路:离散。将所有交点求出来,相当于将多变形的边切成了很多条元边,对每条元边,有两种情况

  • 在圆内,答案加上此边长
  • 在圆外,答案加上此边相对于圆心的"有向转弧"

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #ifndef ONLINE_JUDGE
  4. #include "local.h"
  5. #endif
  6. #define X first
  7. #define Y second
  8. #define pb(x) push_back(x)
  9. #define mp(x, y) make_pair(x, y)
  10. #define all(a) (a).begin(), (a).end()
  11. #define mset(a, x) memset(a, x, sizeof(a))
  12. #define mcpy(a, b) memcpy(a, b, sizeof(a))
  13. typedef long long ll;
  14. template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}
  15. template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);}
  16.  
  17. namespace ConstSet {
  18. const double PI = acos(-1.0);
  19. const double e = 2.718281828459045;
  20. }
  21.  
  22. const double eps = 1e-8;
  23. struct Real {
  24. double x;
  25. double get() { return x; }
  26. int read() { return scanf("%lf", &x); }
  27. Real(const double &x) { this->x = x; }
  28. Real() {}
  29. Real abs() { return x > ? x : -x; }
  30.  
  31. Real operator + (const Real &that) const { return Real(x + that.x);}
  32. Real operator - (const Real &that) const { return Real(x - that.x);}
  33. Real operator * (const Real &that) const { return Real(x * that.x);}
  34. Real operator / (const Real &that) const { return Real(x / that.x);}
  35. Real operator - () const { return Real(-x); }
  36.  
  37. Real operator += (const Real &that) { return Real(x += that.x); }
  38. Real operator -= (const Real &that) { return Real(x -= that.x); }
  39. Real operator *= (const Real &that) { return Real(x *= that.x); }
  40. Real operator /= (const Real &that) { return Real(x /= that.x); }
  41.  
  42. bool operator < (const Real &that) const { return x - that.x <= -eps; }
  43. bool operator > (const Real &that) const { return x - that.x >= eps; }
  44. bool operator == (const Real &that) const { return x - that.x > -eps && x - that.x < eps; }
  45. bool operator <= (const Real &that) const { return x - that.x < eps; }
  46. bool operator >= (const Real &that) const { return x - that.x > -eps; }
  47.  
  48. friend ostream& operator << (ostream &out, const Real &val) {
  49. out << val.x;
  50. return out;
  51. }
  52. friend istream& operator >> (istream &in, Real &val) {
  53. in >> val.x;
  54. return in;
  55. }
  56. };
  57.  
  58. struct Point {
  59. Real x, y;
  60. int read() { return scanf("%lf%lf", &x.x, &y.x); }
  61. Point(const Real &x, const Real &y) { this->x = x; this->y = y; }
  62. Point() {}
  63. Point operator + (const Point &that) const { return Point(this->x + that.x, this->y + that.y); }
  64. Point operator - (const Point &that) const { return Point(this->x - that.x, this->y - that.y); }
  65. Real operator * (const Point &that) const { return x * that.x + y * that.y; }
  66. Point operator * (const Real &that) const { return Point(x * that, y * that); }
  67. Point operator / (const Real &that) { return Point(x / that, y / that); }
  68. Point operator += (const Point &that) { return Point(this->x += that.x, this->y += that.y); }
  69. Point operator -= (const Point &that) { return Point(this->x -= that.x, this->y -= that.y); }
  70. Point operator *= (const Real &that) { return Point(x *= that, y *= that); }
  71. Point operator /= (const Real &that) { return Point(x /= that, y /= that); }
  72.  
  73. bool operator == (const Point &that) const { return x == that.x && y == that.y; }
  74.  
  75. Real cross(const Point &that) const { return x * that.y - y * that.x; }
  76. Real abs() { return sqrt((x * x + y * y).get()); }
  77. };
  78. typedef Point Vector;
  79.  
  80. struct Segment {
  81. Point a, b;
  82. Segment(const Point &a, const Point &b) { this->a = a; this->b = b; }
  83. Segment() {}
  84. bool intersect(const Segment &that) const {
  85. Point c = that.a, d = that.b;
  86. Vector ab = b - a, cd = d - c, ac = c - a, ad = d - a, ca = a - c, cb = b - c;
  87. return ab.cross(ac) * ab.cross(ad) < && cd.cross(ca) * cd.cross(cb) < ;
  88. }
  89. Point getSegmentIntersection(const Segment &that) const {
  90. Vector u = a - that.a, v = b - a, w = that.b - that.a;
  91. Real t = w.cross(u) / v.cross(w);
  92. return a + v * t;
  93. }
  94. Real Distance(Point P) {
  95. Point A = a, B = b;
  96. if (A == B) return (P - A).abs();
  97. Vector v1 = B - A, v2 = P - A, v3 = P - B;
  98. if (v1 * v2 < ) return v2.abs();
  99. if (v1 * v3 > ) return v3.abs();
  100. return v1.cross(v2).abs() / v1.abs();
  101. }
  102. bool containPoint(const Point &p) const {
  103. Vector ap = p - a, bp = p - b;
  104. return ap * bp < ;
  105. }
  106. };
  107.  
  108. struct Line {
  109. Point p;
  110. Vector v;
  111. Line(Point p, Vector v): p(p), v(v) {}
  112. Line() {}
  113. Point point(Real a) {
  114. return p + v * a;
  115. }
  116. };
  117. struct Circle {
  118. Point c;
  119. Real r;
  120. Circle(Point c, Real r): c(c), r(r) {}
  121. Circle() {}
  122. void read() {
  123. c.read();
  124. scanf("%lf", &r.x);
  125. }
  126. Point point(Real a) {
  127. return Point(c.x + r * cos(a.get()), c.y + r * sin(a.get()));
  128. }
  129. int getLineIntersection(Line L, vector<Point> &sol) {
  130. Circle C = *this;
  131. Real a = L.v.x, b = L.p.x - C.c.x, c = L.v.y, d = L.p.y - C.c.y;
  132. Real e = a * a + c * c, f = (a * b + c * d) * , g = b * b + d * d - C.r * C.r;
  133. Real delta = f * f - e * g * ;
  134. Real t1, t2;
  135. if (delta < ) return ;
  136. if (delta == ) {
  137. t1 = t2 = -f / (e * ); sol.push_back(L.point(t1));
  138. return ;
  139. }
  140. t1 = (-f - sqrt(delta.get())) / (e * ); sol.push_back(L.point(t1));
  141. t2 = (-f + sqrt(delta.get())) / (e * ); sol.push_back(L.point(t2));
  142. return ;
  143. }
  144. Real turningAngle(Point a, Point b) {
  145. Vector ca = a - c, cb = b - c;
  146. if (ca.abs() == || cb.abs() == ) return ;//一个点和圆心重合,计算转角是没意义的
  147. Real angle = acos((ca * cb / ca.abs() / cb.abs()).get());
  148. return ca.cross(cb) >= ? angle : -angle;
  149. }
  150. };
  151.  
  152. const int maxn = 1e3 + ;
  153.  
  154. Point p[maxn];
  155.  
  156. int main() {
  157. #ifndef ONLINE_JUDGE
  158. freopen("in.txt", "r", stdin);
  159. //freopen("out.txt", "w", stdout);
  160. #endif // ONLINE_JUDGE
  161. int n;
  162. while (cin >> n, n) {
  163. for (int i = ; i < n; i ++) {
  164. p[i].read();
  165. }
  166. Circle c;
  167. c.read();
  168. vector<Point> vs;
  169. for (int i = ; i < n; i ++) {
  170. vs.pb(p[i]);
  171. vector<Point> v;
  172. Point a = p[i], b = p[(i + ) % n];
  173. c.getLineIntersection(Line(a, b - a), v);
  174. for (int i = ; i < v.size(); i ++) {
  175. if (Segment(a, b).containPoint(v[i])) vs.pb(v[i]);
  176. }
  177. }
  178. Real ans = ;
  179. for (int i = ; i < vs.size(); i ++) {
  180. int j = (i + ) % vs.size();
  181. Point mid = (vs[i] + vs[j]) * 0.5;
  182. Real length = (mid - c.c).abs();
  183. if (length < c.r) ans += (vs[j] - vs[i]).abs();
  184. else ans += c.r * -c.turningAngle(vs[i], vs[j]);
  185. }
  186. cout << (ll)(ans.get() + 0.5) << endl;
  187. }
  188. return ;
  189. }

[hihoCoder1231 2015BeijingOnline]求圆与多边形公共部分的周长的更多相关文章

  1. 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板

    链接:https://www.nowcoder.com/acm/contest/141/J来源:牛客网 Eddy has graduated from college. Currently, he i ...

  2. 简单几何(圆与多边形公共面积) UVALive 7072 Signal Interference (14广州D)

    题目传送门 题意:一个多边形,A点和B点,满足PB <= k * PA的P的范围与多边形的公共面积. 分析:这是个阿波罗尼斯圆.既然是圆,那么设圆的一般方程:(x + D/2) ^ 2 + (y ...

  3. HDU - 2892:area (圆与多边形交 求面积)

    pro:飞行员去轰炸一个小岛,给出炸弹落地点的位置信息,以及轰炸半径:按顺时针或者逆时针给出小岛的边界点. 求被轰炸的小岛面积. sol:即是求圆和多边形的面积交. (只会套板子的我改头换面,先理解然 ...

  4. Gym-101158J Cover the Polygon with Your Disk 计算几何 求动圆与多边形最大面积交

    题面 题意:给出小于10个点形成的凸多边形 和一个半径为r 可以移动的圆 求圆心在何处的面积交最大,面积为多少 题解:三分套三分求出圆心位置,再用圆与多边形面积求交 #include<bits/ ...

  5. hdu 5130(2014广州 圆与多边形相交模板)

    题意:一个很多个点p构成的多边形,pb <= pa * k时p所占区域与多边形相交面积 设p(x,y),       (x - xb)^2+(y - yb)^2 / (x - xa)^2+(y ...

  6. A Round Peg in a Ground Hole - POJ 1584 (判断凸多边形&判断点在多边形内&判断圆在多边形内)

    题目大意:首先给一个圆的半径和圆心,然后给一个多边形的所有点(多边形按照顺时针或者逆时针给的),求,这个多边形是否是凸多边形,如果是凸多边形在判断这个圆是否在这个凸多边形内.   分析:判断凸多边形可 ...

  7. codeforces 8D Two Friends 二分+ 判断三个圆是否有公共交点

    题目链接 有两个人x, y, 现在在A点, x要直接去B点, y要先去C点在去B点, 现在给出x, y两人可以行走的最大距离T1, T2, 求出他们从A点出发之后, 可以走的最长的公共路径. 我们先看 ...

  8. Gym - 101208J 2013 ACM-ICPC World Finals J.Pollution Solution 圆与多边形面积交

    题面 题意:给你一个半圆,和另一个多边形(可凹可凸),求面积交 题解:直接上板子,因为其实这个多边形不会穿过这个半圆,所以他和圆的交也就是和半圆的交 打的时候队友说凹的不行,不是板题,后面想想,圆与多 ...

  9. hdu 3982 Harry Potter and J.K.Rowling (半平面交 + 圆与多边形交)

    Problem - 3982 题意就是给出一个圆心在原点半径为R的圆形蛋糕,上面有一个cherry,对蛋糕切若干刀,最后要求求出有cherry的那块的面积占整个蛋糕的多少. 做法显而易见,就是一个半平 ...

随机推荐

  1. ELK(日志审计系统)

    ELk简介及工作流程 ELK即(Elasticsearch + Logstash + Kibana) 下载安装包 系统环境:Contos7.0 Java环境:Portal(这是历史下载地址,我的是 j ...

  2. 曹工说Redis源码(7)-- redis server 的周期执行任务,到底要做些啥

    文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...

  3. 功能测试--聊天功能测试&微信聊天

    微信聊天功能测试 发送对象 普通用户.公众号.群.其他特殊主体 衍生功能 转发.语音转文字.删除等 消息发送 单聊.群聊.语音.文字.图片.表情.链接.字符及长度 消息管理 发布通知.接受通知.发文件 ...

  4. 一行配置美化 nginx 目录 autoindex.html

    demo

  5. 在java中使用JMH(Java Microbenchmark Harness)做性能测试

    文章目录 使用JMH做性能测试 BenchmarkMode Fork和Warmup State和Scope 在java中使用JMH(Java Microbenchmark Harness)做性能测试 ...

  6. vue2.x学习笔记(二十九)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12682822.html. 路由 官方路由 对于大多数的单页面应用,都推荐使用官方支持的vue-router库. 从 ...

  7. 怎样借助Python爬虫给宝宝起个好名字

    每个人一生中都会遇到一件事情,在事情出现之前不会关心,但是事情一旦来临就发现它极其重要,并且需要在很短的时间内做出重大决定,那就是给自己的新生宝宝起个名字.因为要在孩子出生后两周内起个名字(需要办理出 ...

  8. echarts自定义tooltip显示

    使用echarts展示图形的时候,鼠标滑倒图像上,想展示除了系列名,数据名,数据值以外的数据,这时需要使用tooltip的fommater方式进行配置,另外对数据格式也有一定的要求. 如图所示:如果想 ...

  9. CentOS 7 编译错误解决方法集合

    解决 error: the HTTP XSLT module requires the libxml2/libxslt 错误 yum -y install libxml2 libxml2-dev yu ...

  10. Jmeter 性能测试(需求/指标分析与定义)

    1.一般而言,被测对象的性能需求,会在用户需求规格说明书中给出,如单位时间内的访问量需达到多少?业务响应时间不超过多少?业务成功率不低于多少?硬件资源耗用要在一个合理的范围中. 如下性能指标非常明确 ...