题目链接

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

对于凸包上任意一条边$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. Redis入门到高可用(五)—— 单线程

    一.单线程为何这么快 1)绝大部分请求是纯粹的内存操作(非常快速) 2)采用单线程,避免了不必要的上下文切换和竞争条件 3)非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框 ...

  2. Sublime Text 许可证

    ----- BEGIN LICENSE Alexander Single User License EA7E- 51F47F09 4EAB1285 7827EFF0 8B1207DC A76A6EA3 ...

  3. VS Code的golang开发配置 之 代码提示

    之前用VS Code的时候,发现自己的代码的提示一直不好,换用JetBrain的Goland的代码提示是好了,但是比较占用资源.在网上找了一些资料,发现很多人也是遇到第三方或者自己的代码无法提示的情况 ...

  4. 要求根据RandomStr.java:使用类型转换生成六位验证字符串,示例程序每次运 行时,都会生成不同的字符串。

    1.程序设计思想验证码 ①定义一个字符串变量来保存随机生成的. ②利用循环产生六位随机数,在产生每一位时将其转换为char类型并写在字符串后面. ③利用对话框显示生成的验证码,并提示用户输入验证码. ...

  5. Facebook的bigpipe

    参考文档:英文版:http://www.cubrid.org/blog/dev-platform/faster-web-page-loading-with-facebook-bigpipe/ 搜索技术 ...

  6. 家庭记账本之GitHub账号注册与安装(一)

    账号注册 1.github是世纪上最大的开源代码托管网站.因为是国外网站,很多人在注册的时候因为不熟悉英语而犯了难. 2.百度搜索github进入官网.如果你已经有账号密码,那么点击右上角的sign ...

  7. cocos2dx (关于斗地主人物偏移位置)

    就是说不管是谁登陆游戏,你的人物信息资料始终在平板电脑的屏幕正下方(位置坐标需要自己设定,我设置定的是0号位() char LandLordsScene::getUIPosition(char pos ...

  8. arcgis api for flex 开发入门

    参考:http://blog.sina.com.cn/s/articlelist_2346836525_1_1.html 参考教程:https://www.jb51.net/books/81280.h ...

  9. shell基础:数值运算与运算符

    linux的shell中,变量的类型默认都是字符串型. export将aa声明为环境变量.也可用declare声明.其实就是改变了-x属性 $(()) 最常用.

  10. 010-判断是否回传IsPostBack属性

    属性IsPostBack:判断是否回传 如果是第一次请求,则返回false 如果是回传请求,则返回true->说明:只有使用服务器端表单才可以正常使用IsPostBack->使用情境:当在 ...