带劲的计算几何【这一定是我WC之前开的最后一道计几!!!

每个点画个圆然后看一下交点 然后判断是多边形内还是多边形外

这个就是取圆上中点然后射线法

eps我1e-8才过 不知道为啥有的人说只能开1e-3

写了三天带劲= =

还有注意long double!附了一组数据~

//Love and Freedom.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define eps 1e-8
#define mxn 510
#define db long double
using namespace std;const db pi = acosl(-1.0);struct poi
{db x,y;poi(){}poi(db _x,db _y){x=_x,y=_y;}
};typedef poi vec;bool operator ==(vec a,vec b){return a.x==b.x&&a.y==b.y;}
vec operator +(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
vec operator -(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
vec operator *(vec a,db b){return vec(a.x*b,a.y*b);}
db cross(vec a,vec b){return a.x*b.y-a.y*b.x;}
db value(vec a,vec b){return a.x*b.x+a.y*b.y;}
db len(vec a){return a.x*a.x+a.y*a.y;}
db ang(vec a){return atan2(a.y,a.x);}struct line
{poi p; vec v; db ang;line(){}line(poi _p,poi _v){p=_p; v=_v;ang = atan2(v.y,v.x);}
}li[mxn];db cir[mxn]; int cnt,n,m;
poi mid[mxn];db section(line a,line b)
{db k = cross(a.v+a.p-b.p,a.p-b.p)/(cross(a.v+a.p-b.p,b.v)+cross(b.v,a.p-b.p));return k;
}void get(line a,db r)
{db c = - r*r + len(a.p);db aa = len(a.v);db b = 2.0*(a.v.x*a.p.x+a.v.y*a.p.y);db delta = b*b - 4.0 * aa * c;if(delta < 0) return ;delta = sqrt(delta);db k1 = (-b + delta)/(2.0*aa);if(abs(delta)<eps){poi tmp = a.p+a.v*k1;if(k1>-eps && k1-1.0<eps)   cir[++cnt] =atan2(tmp.y,tmp.x);return;}db k2 = (-b-delta)/(2.0*aa);poi tmp = a.p+a.v*k1;if(k1>-eps && k1-1.0<eps)   cir[++cnt] = atan2(tmp.y,tmp.x);tmp = a.p+a.v*k2;if(k2>-eps && k2-1.0<eps)   cir[++cnt] = atan2(tmp.y,tmp.x);
}void put(poi a)
{printf("p===%lf %lf\n",a.x,a.y);
}void putl(line a)
{printf("ls--------------\n");put(a.p); put(a.v); printf("%lf\n",a.ang);printf("le--------------\n");
}bool between(line a,poi b)
{int tmp=0;if(a.v.x <= 0.0){if(b.x <= a.p.x && b.x >= a.p.x+a.v.x)    tmp++;}else{if(b.x >= a.p.x && b.x <= a.p.x+a.v.x)   tmp++;}if(a.v.y <= 0.0){if(b.y <= a.p.y && b.y >= a.p.y+a.v.y)   tmp++;}else{if(b.y >= a.p.y && b.y <= a.p.y+a.v.y)   tmp++;}return tmp==2;
}bool check(poi x)
{for(int i=1;i<=m;i++)if(between(li[i],x) && abs(cross(x-li[i].p,li[i].v))<eps)return 0;int cer = 0;line tmp = line(x,poi(2794406.11,-2564800.0132));for(int i=1;i<=m;i++){db w = section(tmp,li[i]);db ww = section(li[i],tmp);if( ww>1.0 || ww<0.0 || w>1.0 || w<0.0)continue;cer++;}if(cer&1) return 1;return 0;
}bool cmp(poi a,poi b)
{return ang(a) < ang(b) || (abs(ang(a)-ang(b))<eps&& cross(a,b)>eps);
}bool same(poi a,poi b)
{return abs(a.x-b.x)<eps && abs(a.y-b.y) <eps;
}
poi enemy[mxn],stk[mxn];db makecircle(int id,db r)
{cnt = 0; db ans = 0.0;for(int i=1;i<=m;i++)get(li[i],r);if(!cnt){if(check(enemy[id])) return 2*pi;return 0.0;}sort(cir+1,cir+cnt+1);int tot = cnt; cnt=1;for(int i=2;i<=tot;i++)if(abs(cir[i]-cir[i-1])>eps)cir[++cnt] = cir[i];cir[cnt+1] = cir[1] + 2*pi;for(int i=1;i<=cnt;i++){db theta = (cir[i] + cir[i+1]); theta = theta/2.0;mid[i] = vec(r*cosl(theta),r*sinl(theta));}if(cnt==2){if(check(mid[1])){db ang = cir[2] - cir[1];ans += ang;}return ans;}for(int i=1;i<=cnt;i++){if(check(mid[i])){db ang = cir[i+1] - cir[i];ans += ang;}}return ans;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%Lf%Lf",&enemy[i].x,&enemy[i].y);for(int i=1;i<=m;i++)scanf("%Lf%Lf",&stk[i].x,&stk[i].y);for(int i=1;i<m;i++)li[i]=line(stk[i],stk[i+1]-stk[i]);li[m] = line(stk[m],stk[1]-stk[m]);db full,r,ans=0.0;for(int i=1;i<=n;i++){r = sqrtl(len(enemy[i]));if(r<eps){if(check(poi(0,0)))   ans += 1.00000;continue;}full = 2*pi;ans += makecircle(i,r)/full;}printf("%.5Lf\n",ans);return 0;
}
/**
1 7
1 1
2 1
-1 -1
-1 1
1 1
1 2
3 1
2 -1
*/

LOJ6437 PKUSC2018 PKUSC相关推荐

  1. 「PKUSC2018」星际穿越 (70分做法)

    5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 27  Solved: 11 [Submit][Statu ...

  2. 洛谷p5465 [PKUSC2018]星际穿越

    [洛谷p5465][PKUSC2018]星际穿越 题面 洛谷 题解 众所周知PKUSC的题大多都不可做,今天好不容易看到1个倍增水题(我猜当时应该全场切了). 我们设\(f[i][j]\)表示\(i\ ...

  3. 胡小兔的 PKUSC2018 游记

    Day 0 一番纠结之后,我还是选择了 PKUSC (Penguin Kingdom University Summer Camp, 企鹅王国大学夏令营)! 理由?扔硬币决定的理由如下: PKU好啊 ...

  4. [PKUSC2018]真实排名——线段树+组合数

    题目链接: [PKUSC2018]真实排名 对于每个数$val$分两种情况讨论: 1.当$val$不翻倍时,那么可以翻倍的是权值比$\frac{val-1}{2}$小的和大于等于$val$的. 2.当 ...

  5. 「PKUSC2018」神仙的游戏 - 题解

    「PKUSC2018」神仙的游戏 题意:给出一个01?串,其中?可以代替成为0或1,令 $ F(i) $ 表示是否存在长度为 $ i $ 的border,求 $ (F(1) \times 1 \tim ...

  6. PKUSC 2018 游记

    文章目录 General Introduction Day -2 ~ Day -1 Day 0 Day 1 上午 题目 1 2 3 4 5 6 7 8 9 10 下午 题目 1. 真实排名 2. 随机 ...

  7. PKUSC 2022游记

    Day0 虽说是线上的,但还是勉为其难称之为游记吧.毕竟,如果叫考场实录什么的又怪怪的. 上午打了SDOI2022 Day1,为了适应PKUSC所以是IOI的形式,但是165pts的成绩在IOI的形式 ...

  8. [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)

    [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增) 题面 n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短 ...

  9. PKUSC 2022 游记--zhengjun

    day1 上午 先看了 PKUSC 2022 的开幕式,看了北大的介绍之类的,感觉似乎在损清华? 然后试机测试了一下,发现放了一道去年考的 T1. 下午 考试开始,先看了 3 3 3 道题,然后感觉 ...

  10. THUWC、THUSC、PKUWC和PKUSC介绍

    先申明,我本人没有申请过这些营,本文大部分内容来自QQ群里信息,感谢群里各位参加的家长和所有群友,尤其特别感谢群里的Wonder what to be for.Night Watcher,三浪淘沙,r ...

最新文章

  1. 这家剑桥校友创办的苏州AI独角兽,再获4.1亿投资,将在国内IPO
  2. YL杯超级篮球赛(jzoj 1325)
  3. Java EE 7发布–反馈和新闻报道
  4. 董明珠的“接班人”出现了!这个22岁的小姑娘,凭什么?
  5. python邮箱爆破_Python在线爆破邮箱账号密码测试代码(亲测可用)
  6. Linux流量监控工具 – iftop
  7. webpack4+vue打包简单入门
  8. https证书、公钥、私钥、签名介绍
  9. 关于UI设计学习,推荐6个高质量的学习网站!
  10. Weex Android SDK源码分析
  11. API安全(二):API安全设计原则
  12. 飞腾cpu服务器浪潮信息,浪潮发布基于国产飞腾CPU的服务器
  13. 湖南师范大学计算机专业研究生读几年,湖南师范大学计算机专业在职研究生培养方式是怎样的?...
  14. Python遇到过得text和text()
  15. [GameFramework]Demo-StarForce无封装简陋不完全版
  16. 2022-2023年控制领域、工程领域、计算机领域、人工智能领域国家重点实验室开放基金申请指南
  17. star-rating评分插件的使用
  18. Excel客户等级星级表达
  19. 【历史上的今天】10 月 16 日:PayPal 正式上线;阿里巴巴收购优酷土豆;网络工具 Ping 发明者诞生
  20. 7-6 打印水仙花数(10 分)

热门文章

  1. 150个摄影测量与遥感术语,你知多少?
  2. linux geos 动态库,未经sudo许可在linux上安装GEOS库
  3. c语言如何将十六进制转化为二进制数,C语言--将十进制整数转化为二进制与十六进制输出...
  4. 好好说话 -简单概括
  5. eclipse之 Type Hierachy:Viewing the type hierarchy
  6. 无人车传感器 GPS 深入剖析
  7. 利用stm32串口中断进行数码管显示
  8. 通俗易懂的 k-means 聚类算法原理及优化(附代码)
  9. 阿里云ASR 语音识别接口调用
  10. php怎么看回调的异步通知的数据_paypal支付,异步回调(php)