题目链接

半平面交,注意直线方向!!!

对于凸包上任意一条边$LINE(p_i,p_{i+1})$都有$S_{\Delta{p_i} {p_{i + 1}}p} < S_{\Delta{p_0} {p_1}p}$

如果我们用叉积来算面积:

$P=(x,y)$

$A=p_0=(x_1,y_1)$

$B=p_1=(x_2,y_2)$

$C=p_{i+1}=(x_3,y_3)$(至于为什么是C为i+1而不是D为i+1,画画图就知道了)

$D=p_i=(x_4,y_4)$

就有不等式:

$(x-x_2,y-y_2)(x-x_1,y-y_1)\leqslant(x-x_3,y-y_3)(x-x_4,y-y_4)$

$\Rightarrow$

$(x-x_2)(y-y_1)-(y-y_2)(x-x_1) \leqslant (x-x_3)(y-y_4)-(y-y_3)(x-x_4)$

$\Rightarrow$

$(-y_1+y_2-y_3-y_4)x+(x_1-x_2+x_3-x_4)y+$$(x_2\times y_1-y_2\times x_1)+(x_4\times y_3-y_4\times x_3) \leqslant 0$

$\Rightarrow$

$(-y_1+y_2-y_3-y_4)x+(x_1-x_2+x_3-x_4)y+\overrightarrow B\times\overrightarrow A+\overrightarrow D\times \overrightarrow C\leqslant 0$

就得到了一个半平面

交一交即可

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<set>
#include<queue>
#define op operator
#define re(i,l,r) for(int i=(l);i<=(r);i++)
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
using namespace std;
template <typename Q>
void inin(Q &ret)
{
ret=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
ret=f?-ret:ret;
}
int shurux,shuruy;
const double eps=1e-;
int dcmp(const double &x){return abs(x)<eps?:x<?-:;}
const double pi=acos(-);
const double f(const double &a){return a*a;}
struct xl
{
double x,y;
xl(double x=,double y=):x(x),y(y){}
void in(){inin(shurux),inin(shuruy);x=shurux,y=shuruy;}
bool op < (const xl &rhs)const {return x==rhs.x?y<rhs.y:x<rhs.x;}
xl op + (const double &rhs)const {return xl(x+rhs,y+rhs);}
xl op - (const double &rhs)const {return xl(x-rhs,y-rhs);}
xl op * (const double &rhs)const {return xl(x*rhs,y*rhs);}
xl op / (const double &rhs)const {return xl(x/rhs,y/rhs);}
xl op + (const xl &rhs)const {return xl(x+rhs.x,y+rhs.y);}
xl op - (const xl &rhs)const {return xl(x-rhs.x,y-rhs.y);}
double angle()const {return atan2(y,x);}
double len()const {return sqrt(f(x)+f(y));}
};
double D_(const xl &a,const xl &b){return a.x*b.x+a.y*b.y;}
double X_(const xl &a,const xl &b){return a.x*b.y-a.y*b.x;}
double dis(const xl &a,const xl &b){return sqrt(f(a.x-b.x)+f(a.y-b.y));}
double dis2(const xl &a,const xl &b){return (a.x-b.x)*(a.x+b.x)+f(a.y-b.y);}
double angle(const xl &a,const xl &b){return acos(D_(a,b)/a.len()/b.len());}
struct LINE
{
xl u,v;double rad;
LINE(xl u=xl(,),xl v=xl(,)):u(u),v(v){}
void js(){rad=(v-u).angle();}
bool op < (const LINE &rhs)const {return rad<rhs.rad;}
};
xl p[],ch[];
LINE a[],b[];
bool onleft(const xl &a,const LINE &l){return dcmp(X_(l.v-l.u,a-l.u))>;}
LINE getline2(xl C,xl D)
{
xl A=p[],B=p[];
// if(D_(B-A,D-C)<0)swap(C,D);
double a=(-A.y+B.y-C.y+D.y),b=(A.x-B.x+C.x-D.x),c=X_(B,A)+X_(D,C);
LINE ret(xl(,-c/b),xl(,(-c-a)/b));
if(!dcmp(b))ret=LINE(xl(-c/a,),xl((-c-b)/a,));
if(!onleft(p[],ret)&&!onleft(p[],ret))swap(ret.u,ret.v);
return ret;
}
LINE getline(xl C,xl D)
{
LINE l=getline2(C,D);
int wocao1=onleft(p[],l)|onleft(p[],l);
int wocao2=onleft(C,l)|onleft(D,l);
if(wocao1^wocao2)return l;
else return getline2(D,C);
}
xl getjd(const LINE &a,const LINE &b)
{
xl u=a.u-b.u,v1=a.v-a.u,v2=b.v-b.u;
double t=X_(v2,u)/X_(v1,v2);
return a.u+v1*t;
}
int n,nn;
bool halfplanej(LINE *l)
{
re(i,,n-)l[i].rad=(l[i].v-l[i].u).angle();
sort(l,l+n);
int ll=,rr=;
xl p[n];LINE b[n];b[]=l[];
re(i,,n-)
{
while(ll<rr&&!onleft(p[rr-],l[i]))rr--;
while(ll<rr&&!onleft(p[ll],l[i]))ll++;
b[++rr]=l[i];
if(!dcmp(X_(b[rr].v-b[rr].u,b[rr-].v-b[rr-].u)))
{
rr--;
if(onleft(l[i].u,b[rr]))b[rr]=l[i];
}
if(ll<rr)p[rr-]=getjd(b[rr-],b[rr]);
}
while(ll<rr&&!onleft(p[rr-],b[ll]))rr--;
if(rr-ll<=)return ;
p[rr]=getjd(b[rr],b[ll]);
re(i,ll,rr)ch[nn++]=p[i];
ch[nn]=ch[];return ;
}
double zongarea,yaoarea;
int main()
{
inin(n);
re(i,,n-)p[i].in();
p[n]=p[];
xl temp=p[]-p[];
re(i,,n-)zongarea+=abs(X_(temp,p[i+]-p[i])),temp=temp+(p[i+]-p[i]);
a[]=LINE(p[],p[]);
re(i,,n-)
a[i]=getline2(p[i+],p[i]);
halfplanej(a);
temp=ch[]-ch[];
re(i,,nn-)
yaoarea+=abs(X_(temp,ch[i+]-ch[i])),temp=temp+(ch[i+]-ch[i]);
printf("%.4f",yaoarea/zongarea);
return ;
}

bzoj4445 小凸想跑步的更多相关文章

  1. 【BZOJ4445】[Scoi2015]小凸想跑步 半平面交

    [BZOJ4445][Scoi2015]小凸想跑步 Description 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸n边形,N个顶点按照逆时针从0-n-l编号.现 ...

  2. 【BZOJ4445】[SCOI2015]小凸想跑步(半平面交)

    [BZOJ4445][SCOI2015]小凸想跑步(半平面交) 题面 BZOJ 洛谷 题解 首先把点给设出来,\(A(x_a,y_a),B(x_b,y_b),C(x_c,y_c),D(x_d,y_d) ...

  3. 「SCOI2015」小凸想跑步 解题报告

    「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...

  4. Loj 2008 小凸想跑步

    Loj 2008 小凸想跑步 \(S(P,p_0,p_1)<S(P,p_i,p_{i+1})\) 这个约束条件对于 \(P_x,P_y\) 是线性的,即将面积用向量叉积表示,暴力拆开,可得到 \ ...

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

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

  6. 【bzoj4445 scoi2015】小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 nn 边形, nn 个顶点按照逆时针从 00 ∼ n - 1n−1 编号.现在小凸随机站在操场中的某个位置,标 ...

  7. [SCOI2015]小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...

  8. BZOJ 4445 [Scoi2015]小凸想跑步:半平面交

    传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...

  9. BZOJ4445 SCOI2015小凸想跑步(半平面交)

    考虑怎样的点满足条件.设其为(xp,yp),则要满足(x0-xp,y0-yp)×(x1-xp,y1-yp)<=(xi-xp,yi-yp)×(xi+1-xp,yi+1-yp)对任意i成立.拆开式子 ...

随机推荐

  1. MySQL 5.7 新特性大全和未来展望

    引用 美图公司数据库高级 DBA,负责美图后端数据存储平台建设和架构设计.前新浪高级数据库工程师,负责新浪微博核心数据库架构改造优化,以及数据库相关的服务器存储选型设计.之前在「高可用架构」发表的&l ...

  2. 003-pro ant design 前端权限处理-支持URL参数的页面

    前天需要增加MD5引用 https://www.bootcdn.cn/blueimp-md5/ 1.修改权限文件(CheckPermissions.js)使用自定义权限 2.配置异常页面 2.1.创建 ...

  3. pycharm的小问题之光标

    一大早起来,突然发现pycharm的光变粗,按退格键会删除编写的内容,超级难受(如下图), 百度一下,也不知道在百度框里输什么关键字好,但最后还是找到了,哈哈.... ​ 解决方法: 1.按键盘上In ...

  4. JavaScript基础学习2

    /* 1.把函数作为参数.匿名函数作为参数传递到函数 */ function dogEat(food) { console.log("dog eat " + food); } fu ...

  5. 万恶之源 - Python 自定义模块

    自定义模块 我们今天来学习一下自定义模块(也就是私人订制),我们要自定义模块,首先就要知道什么是模块啊 一个函数封装一个功能,比如现在有一个软件,不可能将所有程序都写入一个文件,所以咱们应该分文件,组 ...

  6. Angular知识点

    Angular CLI 快速创建Angular 2项目和组件, 压缩打包发布. 7.创建包含html.ts.css文件的命令cd到需要创建文件的目录下面,输入如下命令 ng g c myFile 会自 ...

  7. Java知识点-判断null、空字符串和空格

    Java知识点-判断null.空字符串和空格 // 判断headerKey是否为null,空字符串或者空格 if (headerKey != null && headerKey.len ...

  8. Day7 初识面向对象,面向对象之继承、多态和封装

    一.面向对象引言 一.面向对象的程序设计的由来 详述见:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二.面向对象引子 写一个简单程序 ...

  9. 软RAID管理命令mdadm详解

    软RAID管理命令mdadm详解 mdadm是linux下用于创建和管理软件RAID的命令,是一个模式化命令.但由于现在服务器一般都带有RAID阵列卡,并且RAID阵列卡也很廉价,且由于软件RAID的 ...

  10. Mac上安装PHP、Apache、MySQL

    Mac自带php5.6版本,要升级到php7.3 步骤如下 1,brew 安装php ,如果没有安装,访问https://brew.sh/index_zh-cn安装在终端输入以下内容,不用指定安装ph ...