「SCOI2015」小凸想跑步

最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质

实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了


Code:

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #define Vector Point
  5. const int N=2e5+10;
  6. const double eps=1e-7;
  7. int n,m,l,r;
  8. struct Point
  9. {
  10. double x,y;
  11. Point(){}
  12. Point(double X,double Y){x=X,y=Y;}
  13. double angle(){return atan2(y,x);}
  14. Vector friend operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
  15. Vector friend operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
  16. Vector friend operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
  17. }bee[N],q1[N];
  18. struct Line
  19. {
  20. Point s,t;double ang;
  21. Line(){}
  22. Line(Point S,Point T){s=S,t=T,ang=(t-s).angle();}
  23. }yuu[N],q2[N];
  24. double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
  25. bool isrig(Line a,Point b){return Cross(b-a.s,a.t-a.s)>0;}
  26. bool cmp(Line a,Line b){return fabs(a.ang-b.ang)<eps?isrig(a,b.t):a.ang<b.ang;}
  27. Point jd(Line a,Line b){return a.s+(a.t-a.s)*(Cross(a.s-b.s,b.t-b.s)/Cross(b.t-b.s,a.t-a.s));}
  28. void SI()
  29. {
  30. std::sort(yuu+1,yuu+1+m,cmp);
  31. q2[l=r=1]=yuu[1];
  32. for(int i=2;i<=m;i++)
  33. if(fabs(yuu[i].ang-yuu[i-1].ang)>eps)
  34. {
  35. while(l<r&&isrig(yuu[i],q1[r-1])) --r;
  36. while(l<=r&&isrig(yuu[i],q1[l])) ++l;
  37. q1[r]=jd(q2[r],yuu[i]);
  38. q2[++r]=yuu[i];
  39. }
  40. while(l<r&&isrig(q2[l],q1[r-1])) --r;
  41. q1[r]=jd(q2[l],q2[r]);
  42. }
  43. double area()
  44. {
  45. if(r-l<2) return 0;
  46. double ret=0;
  47. for(int i=l;i<r;i++) ret+=Cross(q1[i],q1[i+1]);
  48. ret+=Cross(q1[r],q1[l]);
  49. return ret/2;
  50. }
  51. int main()
  52. {
  53. scanf("%d",&n);m=n;double sum=0;
  54. for(int i=1;i<=n;i++)
  55. {
  56. scanf("%lf%lf",&bee[i].x,&bee[i].y);
  57. yuu[i]=Line(bee[i-1],bee[i]);
  58. if(i!=1) sum+=Cross(bee[i-1],bee[i]);
  59. }
  60. yuu[1]=Line(bee[n],bee[1]);
  61. sum+=Cross(bee[n],bee[1]);
  62. sum/=2;
  63. bee[++n]=bee[1];
  64. for(int i=3;i<=n;i++)
  65. {
  66. double A=bee[1].y-bee[2].y-(bee[i-1].y-bee[i].y);
  67. double B=bee[2].x-bee[1].x-(bee[i].x-bee[i-1].x);
  68. double C=Cross(bee[1],bee[2])-Cross(bee[i-1],bee[i]);
  69. if(fabs(A)<eps) yuu[++m]=Line(Point(0,-C/B),Point(0,-C/B)+Vector(-B,A));
  70. else yuu[++m]=Line(Point(-C/A,0),Point(-C/A,0)+Vector(-B,A));
  71. }
  72. SI();
  73. printf("%.4f\n",area()/sum);
  74. return 0;
  75. }

2019.3.4

「SCOI2015」小凸想跑步 解题报告的更多相关文章

  1. loj #2008. 「SCOI2015」小凸想跑步

    #2008. 「SCOI2015」小凸想跑步   题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...

  2. 「SCOI2015」小凸解密码 解题报告

    「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...

  3. 「SCOI2015」小凸玩矩阵 解题报告

    「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...

  4. 「SCOI2015」小凸玩密室 解题报告

    「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...

  5. 【LOJ】 #2008. 「SCOI2015」小凸想跑步

    题解 一道想法很简单的计算几何(由于我半平面交总是写不对,我理所当然的怀疑半平面交错了,事实上是我直线建错了) 首先我们对于两个凸包上的点设为\((x_0,y_0)\)和\((x_1,y_1)\)(逆 ...

  6. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  7. loj #2006. 「SCOI2015」小凸玩矩阵

    #2006. 「SCOI2015」小凸玩矩阵   题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...

  8. loj#2009.「SCOI2015」小凸玩密室

    题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...

  9. AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006

    「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...

随机推荐

  1. 【转】给word中的代码着色

    基本操作 1)用Notepad++直接编辑代码文件,注意文件后缀,比如.cpp是C++程序,.m是Matlab,linux文件是.sh,写对后缀表示的文件类型,才有对应的语法高亮效果. 2)选中需要的 ...

  2. O(N) 求数组中最大子串和

    int MaxSubSum3(int *arr, int len) { int i; long long MaxSum = 0; long long CurSum = 0; for(int i = 0 ...

  3. 给网站配置免费的HTTS证书

    取经自思否:https://segmentfault.com/a/1190000015231137 https 的网站 搜索引擎 会优先收录,所以就抽时间记录下配置博客的过程,各种找资料,终于给我找到 ...

  4. React-Native之截图组件view-shot的介绍与使用

    React-Native之截图组件view-shot的介绍与使用 一,需求分析 1,需要将分享页生成图片,并分享到微信好友与朋友圈. 二,react-native-view-shot介绍 1,可以截取 ...

  5. Java 找不到或者无法加载主类

    1 测试Test 类的时候突然遇到一个很奇怪的问题,网上搜了很多资料才找到解决办法,大多数情况是因为类加了包名编译,执行的时候没有到包下去执行.与我遇到的情况不一样. 问题:写了一个测试类Test,在 ...

  6. day 7-11 初识MySQL数据库及安装密码设置破解

    一. 什么是数据库 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序所有的组件都运行在一 ...

  7. AngularJS 中的 factory、 service 和 provider区别,简单易懂

    转自:http://blog.csdn.net/ywl570717586/article/details/51306176 初学 AngularJS 时, 肯定会对其提供 factory . serv ...

  8. awk骚操作

    一.awk自加 [root@168web3 ~]# head /data/logs/cloud_monitor_rds_cpu.log |awk '{sum+=$NF}END{print sum}' ...

  9. docker 列出每个容器的IP

    抄来的...找不到出处了.   常用方法有两种 docker inspect 容器ID | grep IPAddress 方法二 查看docker name: sudo docker inspect ...

  10. qtp 自动货测试桌面程序-笔记(使用参数 parameters)

    dtGlobalSheet:运行整个test时候使用的参数(心得:可以将公共使用的测试数据放于全局表格中,所有action脚本都可以使用同一个数据,如供应商.客户.商品) dtActionSheet: ...