bzoj4445 小凸想跑步
半平面交,注意直线方向!!!
对于凸包上任意一条边$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 小凸想跑步的更多相关文章
- 【BZOJ4445】[Scoi2015]小凸想跑步 半平面交
[BZOJ4445][Scoi2015]小凸想跑步 Description 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸n边形,N个顶点按照逆时针从0-n-l编号.现 ...
- 【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) ...
- 「SCOI2015」小凸想跑步 解题报告
「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...
- Loj 2008 小凸想跑步
Loj 2008 小凸想跑步 \(S(P,p_0,p_1)<S(P,p_i,p_{i+1})\) 这个约束条件对于 \(P_x,P_y\) 是线性的,即将面积用向量叉积表示,暴力拆开,可得到 \ ...
- loj #2008. 「SCOI2015」小凸想跑步
#2008. 「SCOI2015」小凸想跑步 题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...
- 【bzoj4445 scoi2015】小凸想跑步
题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 nn 边形, nn 个顶点按照逆时针从 00 ∼ n - 1n−1 编号.现在小凸随机站在操场中的某个位置,标 ...
- [SCOI2015]小凸想跑步
题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...
- BZOJ 4445 [Scoi2015]小凸想跑步:半平面交
传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...
- BZOJ4445 SCOI2015小凸想跑步(半平面交)
考虑怎样的点满足条件.设其为(xp,yp),则要满足(x0-xp,y0-yp)×(x1-xp,y1-yp)<=(xi-xp,yi-yp)×(xi+1-xp,yi+1-yp)对任意i成立.拆开式子 ...
随机推荐
- Python3学习之路~5.2 time & datetime模块
time模块 时间相关的操作,时间有三种表示方式: 时间戳 1970年1月1日之后的秒,即:time.time() 格式化的字符串 2014-11-11 11:11, ...
- Fast-R-CNN
基于R-CNN和SPP-Net思想,RBG提出了Fast-R-CNN算法.如果选用VGG16网络进行特征提取,在训练阶段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分别提升9倍和3倍: ...
- 【Python】-NO.99.Note.4.Python -【Python3 条件语句 循环语句】
1.0.0 Summary Tittle:[Python]-NO.99.Note.4.Python -[Python3 条件语句 循环语句] Style:Python Series:Python Si ...
- AOP 入门
1,源码 Application.java package com.bf; import org.springframework.context.ApplicationContext; import ...
- docker 在宿主机上根据进程PID查找归属容器ID
在使用docker时经常出现一台docker主机上跑了多个容器,可能其中一个容器里的进程导致了整个宿主机load很高,其实一条命令就可以找出罪魁祸首 #查找容器ID docker inspect -f ...
- zabbix 自定义监控文本内容
需求:监控服务器硬盘使用率是否有超过80%的 需要监控的文本 root@zabbix zabbix]# cat /etc/zabbix/scripts/data/monitor_disk.txt &q ...
- mybatis运行原理
mybatis运行原理 运行过程中涉及到的类或者接口 Resources(c) :用于加载mybatis核心配置文件 XMLConfigBuilder(c) :用于解析xml文件(核心配置文件) Co ...
- mysql----------局域网数据库:如何让navicat链接局域网其他的数据库。
1.找到被链接的数据库,打开以后有一个自带的mysql数据库,打开以后下面有一个user表,把里面的第一条数据的第一个字段改成% 百分号,然后保存,重启数据库,搞定 2.如果是linux下的话,记得把 ...
- LeetCode141.环形链表
给定一个链表,判断链表中是否有环. 进阶:你能否不使用额外空间解决此题? /** * Definition for singly-linked list. * class ListNode { * i ...
- .NET 黑魔法 - 自定义日志扩展
我们开发程序时避免不了要有日志系统,我们希望有一个通用的.不夹杂任何方言的调用方式,简单地说就是保留微软日志框架的注入方式和使用方式. 比如我们希望这样调用: 我们不希望有个 IAbcLogger, ...