题目链接

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

对于凸包上任意一条边$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. win10安装pycharm及汉化包

    PyCharm 是一款功能强大的 Python 编辑器,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,那么如何安装pycharm呢?都是英文看不懂有没有汉化版呢?跟ytkah一起 ...

  2. js小数点精度问题

    项目背景是用eharts 渲染数据,其中Y 轴的 刻度尺间隔用 interval,代码中如下: yAxis: [ { type : 'value', position:'left', min:minV ...

  3. 重识TP5中模型

    创建一个表MODEL,下面展现代码片段: `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` ) NOT NULL DEFAU ...

  4. sap QG3搜索

    先创建一个QG3系统,创建一个用户. 1: 进入搜索模板 2: 选择软件组件,点击执行 3: 设置过滤条件. 4: 选择在哪一列 设置过滤条件. 5: 定义搜索值 6: 设置值 可以将搜索的结果删除. ...

  5. java实现的加密解密

    void encode(File enfile, File defile) throws Exception { String Algorithm = "DES"; byte[] ...

  6. Http post/get

    什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...

  7. bat脚本简单命令

    1.if 判断 (1.1)判断字符串是否为空: if "%var1%" == " " ( echo null) else(echo not null ) (1. ...

  8. JS控制文本框只能输入数字 \保留小数点后两位

    <input type="text" placeholder="保留到小数点后两位" maxlength="200" onkeyup= ...

  9. svn回复历史版本的操作方法

    svn恢复历史版本的操作方法svn update 保证最新svn log login.php 获得版本号svn diff -r 11026:11027 login.php 发现11027出问题svn ...

  10. iOS 测试企业应用的分发

    开发者能够方便地来做iOS应用的测试分发,目前可以选用“浦公英”和“Fir.im”来做. 生成IPA文件 生成应用的 IPA 文件可以使用命令行 xcodebuild exportArchive -e ...