Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 521  Solved: 224

Description

在平面直角坐标系中给定N个圆。已知这些圆两两没有交点,即两圆的关系只存在相离和包含。求这些圆的异或面

积并。异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑。

Input

第一行包含一个正整数N,代表圆的个数。接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的

圆。保证|x|,|y|,≤10^8,r>0,N<=200000

Output

仅一行一个整数,表示所有圆的异或面积并除以圆周率Pi的结果。

Sample Input

2
0 0 1
0 0 2

Sample Output

3

HINT

Source

几何 思路题

圆之间没有交点是一个很好的性质,这保证如果圆A被圆B包含,我们从某个方向扫描的时候一定先扫到圆B。

用set维护一个“括号序列”,对于当前的扫描线x,圆与x靠下的交点记为左括号,靠上的交点记为右括号,查询当前圆在几层括号里,若在奇数层就减去这个圆的面积,否则加上

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<set>
 7 #define LL long long
 8 using namespace std;
 9 const int mxn=200010;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
14     return x*f;
15 }
16 struct cir{
17     int x,y,r;
18 }c[mxn];
19 struct node{
20     int id;
21     int x,mk;
22 }p[mxn<<1];
23 int tmp,cnt=0;
24 bool operator < (const node &a,const node &b) {
25     double res1=c[a.id].y+a.mk*sqrt((LL)c[a.id].r*c[a.id].r-((LL)tmp-c[a.id].x)*(tmp-c[a.id].x));
26     double res2=c[b.id].y+b.mk*sqrt((LL)c[b.id].r*c[b.id].r-((LL)tmp-c[b.id].x)*(tmp-c[b.id].x));
27     return (res1==res2 && a.mk<b.mk) || (res1<res2);
28 }
29 bool cmp (const node a,const node b){
30     return a.x<b.x;
31 }
32 set<node>st;
33 int n,f[mxn];
34 LL ans=0;
35 int main(){
36     int i,j;
37     n=read();
38     for(i=1;i<=n;i++){
39         c[i].x=read();c[i].y=read();c[i].r=read();
40         p[++cnt]=(node){i,c[i].x-c[i].r,1};
41         p[++cnt]=(node){i,c[i].x+c[i].r,-1};
42     }
43     sort(p+1,p+cnt+1,cmp);
44     for(i=1;i<=cnt;i++){
45         tmp=p[i].x;
46         if(p[i].mk==1){
47             set<node>::iterator it;
48             it=st.upper_bound((node){p[i].id,0,-1});
49             if(it==st.end())f[p[i].id]=1;
50             else{
51                 if( (*it).mk==1 ) f[p[i].id]=-f[(*it).id];
52                 else f[p[i].id]=f[(*it).id];
53             }
54             st.insert((node){p[i].id,0,1});
55             st.insert((node){p[i].id,0,-1});
56         }
57         else{
58             st.erase((node){p[i].id,0,1});
59             st.erase((node){p[i].id,0,-1});
60         }
61     }
62     for(i=1;i<=n;i++){
63         ans+=f[i]*(LL)c[i].r*c[i].r;
64     }
65     printf("%lld\n",ans);
66     return 0;
67 }

转载于:https://www.cnblogs.com/SilverNebula/p/6906835.html

Bzoj4561 [JLoi2016]圆的异或并相关推荐

  1. bzoj 4561: [JLoi2016]圆的异或并(扫描线+set)

    4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 715  Solved: 277 [Submit][Sta ...

  2. 【BZOJ4561】[JLoi2016]圆的异或并

    传送门 把圆拆成上下两个圆弧,因为不存在相交关系,圆弧直接的上下关系是不变的. 用set维护这些圆弧,插入的时候upper_bound一下,如果找到的是上圆弧,就是我外面的第一个圆,否则我外面的第一个 ...

  3. ybtoj洛谷P3268:圆的异或并(扫描线)

    解析 很神奇的一道题. 关键条件:任意两个圆无交. 把一个圆分成上下两个圆弧,那么所有圆弧的高度关系不会发生变化. 所以可以开一个 set,维护一个从左往右扫的扫描线,按照当前扫描线的横坐标定义比较符 ...

  4. 均值不等式链的几何证明

    均值不等式链的几何证明 这是我们高中时所见到的不等式链的关系,接下来将用几何图形的方法进行证明. 首先,做圆 A,直径 BC,在圆上异于 BC 取一点 D,连接 DA,DB,DC,并做 DE 垂直与 ...

  5. 为了防止别人非法使用计算机可以通过,[单选] 为了防止别人非法使用计算机,可以通过为计算机设置口令()。...

    [单选] 为了防止别人非法使用计算机,可以通过为计算机设置口令(). 更多相关问题 已知二面角α-l-β的大小为600,m.n为异面直线,且m⊥α,n⊥β,则m.n所成的角为()A.300B.600C ...

  6. Android多语言支持以及繁简转换

    Android多语言支持以及繁简转换 Android自身就带有多语言支持.前一段时间需要做一个同时支持繁简体的APP,经过简单的搜索和探索,轻松解决了问题.并且写了一个简单的繁体到简单的转换类.分享给 ...

  7. 信息论入门:信息守恒定律与纠错码

    Hamming编码研究 异或⊕的本质 其实"异或"这个名词的名字取得不好,叫"奇运算"都好听些. 以前我们学到异或和同或的时候讲到,异或指2个bit相异时值为1 ...

  8. 图像处理:什么是掩膜

    mask是用于部分或完全隐藏对象或元素的部分的图形操作. 将mask应用于图形对象的效果就好像将图形对象通过遮罩涂在背景上,从而完全或部分地遮盖了图形对象的各个部分,而遮罩内的图像不变化.在图像处理中 ...

  9. 图像处理中的mask(掩膜)

    文章目录: 一.什么是掩膜 二.掩膜的用法 三.掩膜运算的一个小实例 四.小结 在图像处理中,经常会碰到掩膜(Mask)这个词.那么这个词到底是什么意思呢?下面来简单解释一下. 一.什么是掩膜 首先我 ...

最新文章

  1. R语言dplyr包pull函数抽取dataframe数据列实战
  2. 中国科大潘建伟团队量子网络研究获重要进展
  3. 自己实现内存操作函数memset(),memcmp(),memcpy(),memmove()
  4. 使用WMI对象收集计算机信息
  5. 【简便解法】1090 危险品装箱 (25分)_33行代码AC
  6. CentOS 6.5 部署WordPress
  7. 用StyleCop规范团队代码
  8. ​嵌入式开发为什么选择C语言?
  9. 去年全球勒索软件攻击收入达10亿美元
  10. 全新的基于 Windows NT (2000/XP/2003) 的媒体解码包.
  11. 下载频道12月热门资源TOP100强力推荐!
  12. SQL 2005 带自增列 带外键约束 数据导入导出
  13. 绝地求生要java吗_绝地求生卡盟_【Java】几种典型的内存溢出案例,都在这儿了!...
  14. img在div中居中
  15. 用Python画一个精确的中国地图(数据+代码10行)
  16. RadStudio 10.3.3 Rio (Delphi C++ Builder)及TMS TAdvStringGrid控件安装方法
  17. Configure Python interpreter
  18. 随笔-杂记-将对您的电脑造成伤害。 您应该将它移到废纸篓
  19. php幸运大抽奖,幸运大转盘-jQuery+PHP实现的抽奖程序-完善中
  20. 解决微信图片不可引用的问题

热门文章

  1. codeforces 356C Bear and Square Grid
  2. linux各机器之间配置无密码访问
  3. nancy框架安装并使用
  4. Java中的引用类型(强引用、弱引用)和垃圾回收
  5. Linux中cut命令的使用
  6. 在WPF中弹出右键菜单时判断鼠标是否选中该项
  7. W3C DOM操作之创建新节点
  8. 解析XML时DTD的处理--解析时忽略,生成XML文件时加上。-- XML进阶
  9. zookeeper的名词复盘-版本-保证分布式数据原子性
  10. 基于Xml 的IOC 容器-准备文档对象