「SCOI2015」小凸想跑步 解题报告
「SCOI2015」小凸想跑步
最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质
实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了
Code:
#include <cstdio>
#include <cmath>
#include <algorithm>
#define Vector Point
const int N=2e5+10;
const double eps=1e-7;
int n,m,l,r;
struct Point
{
double x,y;
Point(){}
Point(double X,double Y){x=X,y=Y;}
double angle(){return atan2(y,x);}
Vector friend operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
Vector friend operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
Vector friend operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
}bee[N],q1[N];
struct Line
{
Point s,t;double ang;
Line(){}
Line(Point S,Point T){s=S,t=T,ang=(t-s).angle();}
}yuu[N],q2[N];
double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
bool isrig(Line a,Point b){return Cross(b-a.s,a.t-a.s)>0;}
bool cmp(Line a,Line b){return fabs(a.ang-b.ang)<eps?isrig(a,b.t):a.ang<b.ang;}
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));}
void SI()
{
std::sort(yuu+1,yuu+1+m,cmp);
q2[l=r=1]=yuu[1];
for(int i=2;i<=m;i++)
if(fabs(yuu[i].ang-yuu[i-1].ang)>eps)
{
while(l<r&&isrig(yuu[i],q1[r-1])) --r;
while(l<=r&&isrig(yuu[i],q1[l])) ++l;
q1[r]=jd(q2[r],yuu[i]);
q2[++r]=yuu[i];
}
while(l<r&&isrig(q2[l],q1[r-1])) --r;
q1[r]=jd(q2[l],q2[r]);
}
double area()
{
if(r-l<2) return 0;
double ret=0;
for(int i=l;i<r;i++) ret+=Cross(q1[i],q1[i+1]);
ret+=Cross(q1[r],q1[l]);
return ret/2;
}
int main()
{
scanf("%d",&n);m=n;double sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&bee[i].x,&bee[i].y);
yuu[i]=Line(bee[i-1],bee[i]);
if(i!=1) sum+=Cross(bee[i-1],bee[i]);
}
yuu[1]=Line(bee[n],bee[1]);
sum+=Cross(bee[n],bee[1]);
sum/=2;
bee[++n]=bee[1];
for(int i=3;i<=n;i++)
{
double A=bee[1].y-bee[2].y-(bee[i-1].y-bee[i].y);
double B=bee[2].x-bee[1].x-(bee[i].x-bee[i-1].x);
double C=Cross(bee[1],bee[2])-Cross(bee[i-1],bee[i]);
if(fabs(A)<eps) yuu[++m]=Line(Point(0,-C/B),Point(0,-C/B)+Vector(-B,A));
else yuu[++m]=Line(Point(-C/A,0),Point(-C/A,0)+Vector(-B,A));
}
SI();
printf("%.4f\n",area()/sum);
return 0;
}
2019.3.4
「SCOI2015」小凸想跑步 解题报告的更多相关文章
- loj #2008. 「SCOI2015」小凸想跑步
#2008. 「SCOI2015」小凸想跑步 题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...
- 「SCOI2015」小凸解密码 解题报告
「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...
- 「SCOI2015」小凸玩矩阵 解题报告
「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...
- 「SCOI2015」小凸玩密室 解题报告
「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...
- 【LOJ】 #2008. 「SCOI2015」小凸想跑步
题解 一道想法很简单的计算几何(由于我半平面交总是写不对,我理所当然的怀疑半平面交错了,事实上是我直线建错了) 首先我们对于两个凸包上的点设为\((x_0,y_0)\)和\((x_1,y_1)\)(逆 ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- loj #2006. 「SCOI2015」小凸玩矩阵
#2006. 「SCOI2015」小凸玩矩阵 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...
- loj#2009.「SCOI2015」小凸玩密室
题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...
- AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006
「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...
随机推荐
- 现代程序设计 homework-06
写代码爽还是读代码爽? 当然是写代码爽好吧... 读代码明显是读+写两倍的工作量好么... 本次作业要求: 1) 把程序编译通过, 跑起来. 读懂程序,在你觉得比较难懂的地方加上一些注释,这样大家就能 ...
- spring datasource jdbc 密码 加解密
spring datasource 密码加密后运行时解密的解决办法 - 一号门-程序员的工作,程序员的生活(java,python,delphi实战)http://www.yihaomen.com/a ...
- Windows10 Build 18298 桌面显示计算机(此电脑)
- pHP生成唯一单号
这几天一直在写个人使用的用户中心,虽然期间遇到不少的问题,但还是一点点的都解决了,也从制作期间学到不少的知识,今天就说一说利用PHP生成订单单的方法. 订单号,大家都不陌生,无论从在网上购物,还是在线 ...
- vue二次实战(一)
创建好项目(npm run dev 运行项目:先不用运行,或先运行再关闭) 先安装axios! npm install axios 然后! npm install --save axios vue-a ...
- 通用模块设计UMD
https://leohxj.gitbooks.io/front-end-database/content/javascript-modules/about-umd.html UMD(universa ...
- longquan
/** * 登录后将数据填写到主数据 */ public void login(String login_nr) { //File f = new File(android.os.Environmen ...
- Java基础——对象容器(顺序、集合、Hash)
扩展: For-each循环 for (String s: str) { System.out.println(s); } 等同于for (int i = 0; i < str.length; ...
- java学习之—链表(1)
/** * 单链表操作 * Create by Administrator * 2018/6/14 0014 * 下午 2:05 **/ public class Link { public int ...
- python之路--内置函数, 匿名函数
一 . 内置函数 什么是内置函数? 就是python给你提供的. 拿来直接⽤的函数, 比如print., input等等. 字符串类型代码的执⾏ eval() 执⾏字符串类型的代码. 并返回最终结果( ...