题目

描述

​ 有\(n\)个点\(p_1 ,p_2 , \cdots ,\,p_n\) ;

​ 现在\(p_1\)不见了,可能的横纵坐标范围是\([-10^6,10^6]\);

​ 同时需要保证每三个点形成的有向角的符号不改变;

​ 问\(p_1\)可能范围的区域;

范围

​ \(1 \le T \le 1000 \ , \ 3 \le N , \sum \ N \le 5 \times 10^5 , |x_i|,|y_i| \le 10^6\) ;

​ 误差范围:\(10^{-6}\),建议eps取\([10^{-15},10^{-12}]\) ;

题解

  • 以\(p_1\)为原点,得到$p_2-p_1,p_3-p_1,  \cdots ,p_n - p_1 $ ;
  • 问题即求两两点的原点部分的半平面交;
  • 将新的\(p_1,p_2, \cdots, p_n\)按照极角排序;
  • 只需要考虑1.\(p_i-p_{i+1}\),以及2.和\(p_i\)极角相差不超过\(\pi\) 的最远点和\(p_i\)组成的半平面;
  • 简要证明一下:
    • 假设\(p_a-p_b(a<b-1)\)有效却没有被考虑到,并且在\(ab\)中间的并没有漏掉的半平面;
    • 同时假设原点在左半平边;
    • 那么\(\triangle p_ap_bO\)里面一定不能有点,否则假设为\(p_c(a<c<b)\);
    • 那么\(p_c-p_b和p_a-p_c\)会使其无效;
    • 所以一定存在\(p_c(a<c<b)\)在$\triangle $的外面;
    • 由于\(p_b\)没有被\(2\)考虑到,所以一定同时存在\(p_d\)被\(2\)考虑到了;
    • 那么\(p_a-p_c,p_a-p_d\)会使其无效;

一点想法

能不能对所有的\(i=1-n\)求答案呢?;

感觉可以拓展的样子;

//我的半平面交好像很慢的样子QAQ;
#include<bits/stdc++.h>
#define ld double
#define eps 1e-15
#define il inline
using namespace std;
const int N=1000010;
int C,T,n,m,st[N],hd,tl;
const ld pi=acos(-1);
il int dcmp(ld x){return fabs(x)<eps?0:x<0?-1:1;}
struct P{ld x,y;ld ang;P(ld _x=0,ld _y=0):x(_x),y(_y){ang=atan2(y,x);};P operator -(const P&A)const{return P(x-A.x,y-A.y);}P operator +(const P&A)const{return P(x+A.x,y+A.y);}P operator *(const ld&A)const{return P(x*A,y*A);}il bool operator <(const P&A)const{return dcmp(ang-A.ang)<0;}
}p[N],q[N];
ld crs(const P&a,const P&b){return a.x*b.y-a.y*b.x;}
struct L{int a,b;ld ang;L(int _a=0,int _b=0):a(_a),b(_b){ang=atan2(p[b].y-p[a].y,p[b].x-p[a].x);}il bool operator <(const L&A)const{int d=dcmp(ang-A.ang);return !d?dcmp(crs(p[b]-p[a],p[A.b]-p[a]))<0:d<0;}
}l[N];
il char gc(){static char*p1,*p2,s[1000000];if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);return(p1==p2)?EOF:*p1++;
}
il int rd(){int x=0,f=1;char c=gc();while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=gc();}return x*f;
}
il P get(const L&A,const L&B){P u=p[A.b]-p[A.a];P v=p[B.b]-p[B.a];P w=p[A.a]-p[B.a];ld d=crs(v,w)/crs(u,v);return p[A.a]+u*d;
}
il bool judge(const L&A,const P&B){P u=p[A.b]-p[A.a];P v=B-p[A.a];return dcmp(crs(u,v))<=0;
}
il void add(int x,int y){if(judge(L(x,y),P(0,0)))l[++m]=L(y,x);else l[++m]=L(x,y);
}
int main(){freopen("everdream.in","r",stdin);freopen("everdream.out","w",stdout);C=rd();T=rd();while(T--){n=rd();p[0].x=rd();p[0].y=rd();for(int i=1,x,y;i<n;++i){x=rd();y=rd();x-=p[0].x;y-=p[0].y;p[i]=P(x,y);}--n;m=0;sort(p+1,p+n+1);for(int i=1;i<=n;++i)p[i+n]=p[i],p[i+n].ang+=2*pi;int fg=0;for(int i=1;i<=n;++i){if(!dcmp(p[i].ang-p[i+1].ang)){fg=1;break;}add(i,i%n+1);P tmp=P(0,0);tmp.ang=p[i].ang+pi-eps; int j=lower_bound(p+1,p+n*2+1,tmp)-p;if(i+n!=j&&!dcmp(p[j].ang-p[i].ang-pi)){fg=1;break;}--j;if(i!=j&&i+n!=j)add(i,(j-1)%n+1);}if(fg){puts("0.0000000000");continue;}p[n+1]=(P){-1e6,-1e6};p[n+2]=(P){1e6,-1e6};p[n+3]=(P){1e6,1e6};p[n+4]=(P){-1e6,1e6};p[n+1]=p[n+1]-p[0];p[n+2]=p[n+2]-p[0];p[n+3]=p[n+3]-p[0];p[n+4]=p[n+4]-p[0];add(n+1,n+2),add(n+2,n+3);add(n+3,n+4),add(n+4,n+1);sort(l+1,l+m+1);hd=tl=0;st[++tl]=1;for(int i=2;i<=m;++i)if(dcmp(l[i].ang-l[i-1].ang)){while(hd<tl-1 && judge( l[i] , get(l[st[tl]],l[st[tl-1]]) ) )tl--;while(hd<tl-1 && judge( l[i] , get(l[st[hd+1]],l[st[hd+2]]) ) )hd++;st[++tl]=i;}while(hd<tl-2 && judge( l[st[hd+1]] , get(l[st[tl]] , l[st[tl-1]]) ) )tl--;while(hd<tl-2 && judge( l[st[tl]] , get(l[st[hd+1]] , l[st[hd+2]]) ) )hd++;if(tl-hd<=2){puts("0.0000000000");continue;}n=0;st[tl+1]=st[hd+1];for(int i=hd+1;i<=tl;++i)q[++n]=get(l[st[i]],l[st[i+1]]);ld ans=0;q[n+1]=q[1];for(int i=1;i<=n;++i)ans+=crs(q[i],q[i+1]);ans/=2;printf("%.10lf\n",ans);}//printf("%.2lf\n",1.0*clock()/CLOCKS_PER_SEC);return 0;
}

转载于:https://www.cnblogs.com/Paul-Guderian/p/10637835.html

【纪中集训2019.3.30】星辰大海相关推荐

  1. 【纪中集训2019.3.25】芬威克树

    题目 描述 ​ ​ 第一段代码正确第用\(k\)进制\(BIT\)维护了前缀和: ​ 第二段代码由于写错了\(line \ 4\),所以意义发生了改变: ​ 维护第二段代码执行\(ADD(x,v)\) ...

  2. 【纪中集训2019.3.26】动态半平面交

    题目 描述 : 给出强制在线参数\(k\),树的大小\(n\),和每个点的点权\(a_i\); 有\(m\)个询问,每个询问是$u ,d $ 的形式: 表示询问\(u\)为根的子树中,和\(u\)的距 ...

  3. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  4. 【纪中集训2019.3.20】铁路

    题意 描述 现在有一颗树形状的双向铁路,每条边的行驶时间是\(1\): 给出\(m\)条列车行驶的路径\(s_{i}\to t_{i}\),问列车相遇的对数(无序对): \(i和j\)号列车相遇当且仅 ...

  5. 【纪中集训2019.3.15】恶熊咆哮

    题目 描述 有\(n\)只熊,初始时坐标为\((x_i,y_i)\): 这些熊会按照标号依次吼叫,当第\(i\)只熊吼叫,其他熊会移动: \((x_i,y_i)\)会移动到\((x_i \pm 1,y ...

  6. 2019寒假纪中集训总结学期总结(流水账)

    学期总结 这学期上了初三,学校的初.高中校区对调,我们的班主任也由一个生物老师换成了一个化学老师. 之前的班主任比较年轻,跟我们这群学生有这很好的感情,亦师亦友,陪伴我们度过了几乎没有中考压力的初一. ...

  7. 纪中集训2020.01.13【NOIP普及组】模拟赛C组总结————My First Time Write Summary

    纪中集训2020.01.13[NOIP普及组]模拟赛C组总结 题目编号 标题 0 [NOIP普及组模拟]取值( numbers.pas/cpp) 1 [NOIP普及组模拟]数对(pairs.pas/c ...

  8. 纪中集训2020.01.16【NOIP普及组】模拟赛C组总结+【0.Matrix】分析

    纪中集训2020.01.16[NOIP普及组]模拟赛C组总结+[0.Matrix]分析 题目: 0.matrix 1.product 2.binary 3.value 巨佬估分:100+100+40+ ...

  9. [2021.8纪中集训Day14]

    文章目录 1312. 老曹的忧郁 题目 思路 代码 1313. 老曹骑士 题目 思路 代码 1314. 稳定的数字 题目 思路 代码 封锁阳光大学 题目 题目描述 输入格式 输出格式 输入输出样例 说 ...

最新文章

  1. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 3 Keynote: Scott Hanselman
  2. Activity启动流程详解
  3. STM32 UART串口驱动程序
  4. 初步了解OpenSSL命令
  5. 在电商界摸爬滚打10年,我学到这三点经验教训
  6. 一个关于微服务架构和monolithic架构的讨论
  7. Jquery CheckBox全选方法
  8. Java入门到精通——基础篇之static关键字
  9. GTK的.NET的函数库 GTK#
  10. flutter 的gradle下载不了怎么办
  11. 基于OpenCV实现图像线性变化
  12. react开发教程(九)redux基础
  13. 微信支付phpv3给我们留下的坑
  14. 一个很可爱的二次元风格的个人技术博客
  15. Redis常用命令总结,为什么阿里的程序员成长如此之快
  16. 借助Amazon EMR与外部KDC进行身份认证,有效集成业务场景
  17. CentOS7+VMware 14的安装教程
  18. 前端CSS射门动画-为梅西最后一届世界杯加油
  19. 5G套餐资费会越来越便宜,但需注意“限速机制”
  20. 切蛋糕(洛谷P1714)

热门文章

  1. 【BLE】CC2541之动态广播加密数据
  2. P5715 【深基3.例8】三位数排序
  3. DM8 2节点DSC+DW搭建及故障测试
  4. cakephp视图用php文件,CakePHP的视图
  5. Pygame从0实战10(泡泡小游戏添加音效)
  6. 使用ffmpeg合并音频视频并实现背景音乐循环播放
  7. 前端---js中onmouseover和onmouseout事件
  8. 《圈外课程学习记录》3.2 数据化强力说服
  9. TCP/IP卷一:87---TCP拥塞控制之(对标准算法的改进:NewReno、采用选择确认机制、转发确认(FACK)和速率减半、限制传输、拥塞窗口校验)
  10. Cesium军标实现曲线旗标、三角旗标、矩形旗标