BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*
BZOJ4561 JLoi2016 圆的异或并
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
还是挺好的一道题吧,但是考场上没有做出来啊
什么鬼畜扫描线
首先我们发现如果考虑一下容斥,嵌套起来的圆是加减加减这样的
也就是说一个圆的面积应该加上还是减去只和包住它且最小的圆有关系
然后我们考虑一个圆最左边的一个节点(x,y)" role="presentation" style="position: relative;">(x,y)(x,y),如果另一个圆包含了这个圆那么在最左边的时候一定存在(x,y1)" role="presentation" style="position: relative;">(x,y1)(x,y1)和(x,y2)" role="presentation" style="position: relative;">(x,y2)(x,y2)满足y1<y<y2" role="presentation" style="position: relative;">y1<y<y2y1<y<y2
然后如果两个圆的关系是相离,一定存在(x,y1)" role="presentation" style="position: relative;">(x,y1)(x,y1)和(x,y2)" role="presentation" style="position: relative;">(x,y2)(x,y2)满足y1<=y2<y" role="presentation" style="position: relative;">y1<=y2<yy1<=y2<y或者y<y1<=y2" role="presentation" style="position: relative;">y<y1<=y2y<y1<=y2
然后我们只需要用一种支持查询前驱后继的数据结构来维护到一个圆的起始位置的时候恰好比它y大的那个圆是什么,用括号序列的形式来理解一下,如果方向相同就是包含,否则就是相离
然后扫描线扫过去
#include<bits/stdc++.h>
using namespace std;
#define N 200010
#define INF 0x3f3f3f3f
#define pi pair<int,int>
struct Circle{int x,y,r;}c[N];
struct Node{int x,id,typ;}p[N<<1];
struct Point{int id,typ;};
long long pow2(int x){return 1ll*x*x;}
int nowx;
bool operator < (const Point &x,const Point &y){
double yx=(double)c[x.id].y+(double)x.typ*(double)sqrt(pow2(c[x.id].r)-pow2(c[x.id].x-nowx));
double yy=(double)c[y.id].y+(double)y.typ*(double)sqrt(pow2(c[y.id].r)-pow2(c[y.id].x-nowx));
if(yx==yy)return x.typ<y.typ;
return yx<yy;
}
bool cmp(Node a,Node b){return a.x<b.x;}
int n,tot=0,vis[N];
set<Point> s;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].r);
p[++tot]=(Node){c[i].x-c[i].r,i,1};
p[++tot]=(Node){c[i].x+c[i].r,i,-1};
}
sort(p+1,p+tot+1,cmp);
for(int i=1;i<=tot;i++){
nowx=p[i].x;
if(p[i].typ==1){
set<Point>::iterator it;
it=s.upper_bound((Point){p[i].id,1});
if(it==s.end())vis[p[i].id]=1;
else{
if(it->typ==1)vis[p[i].id]=-vis[it->id];
else vis[p[i].id]=vis[it->id];
}
s.insert((Point){p[i].id,1});
s.insert((Point){p[i].id,-1});
}else{
s.erase((Point){p[i].id,1});
s.erase((Point){p[i].id,-1});
}
}
long long ans=0;
for(int i=1;i<=n;i++)ans+=pow2(c[i].r)*vis[i];
printf("%lld",ans);
return 0;
}
BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*的更多相关文章
- [BZOJ4561][JLOI2016]圆的异或并(扫描线)
考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变. 将每个圆拆成两边,左端加右端删.每次加圆时考虑它外面最内层的括号属于谁.用se ...
- 【BZOJ4561】[JLoi2016]圆的异或并 扫描线
[BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一 ...
- bzoj4561: [JLoi2016]圆的异或并 圆的扫描线
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4561 题目: 4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec ...
- bzoj4561: [JLoi2016]圆的异或并
Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
- BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线
扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...
- BZOJ4561 JLOI2016圆的异或并(扫描线+平衡树)
考虑一条扫描线从左到右扫过这些圆.观察某一时刻直线与这些圆的交点,可以发现构成一个类似括号序列的东西,括号的包含关系与圆的包含关系是相同的.并且当扫描线逐渐移动时,括号间的相对顺序不变.于是考虑用se ...
- BZOJ4561: [JLoi2016]圆的异或并 计算几何+treap
因为本题保证两圆之间只有相包含或相离(不用担心两圆重合 因为我没有RE) 所以每个圆之间的相对位置是确定的 也就是可以按极角排序的, 所以可以按横坐标排序后 扫描同时用treap维护加圆删圆(即遇到 ...
- BZOJ 4561: [JLoi2016]圆的异或并 扫描线 + set
看题解看了半天...... Code: #include<bits/stdc++.h> #define maxn 200010 #define ll long long using nam ...
- 【BZOJ-4561】圆的异或并 set + 扫描线
4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 254 Solved: 118[Submit][Statu ...
随机推荐
- Mysql建表好的例子
1. DROP TABLE IF EXISTS `sys_warehouse_area`;CREATE TABLE `sys_warehouse_area` ( `id` bigint(20) NOT ...
- 技术分享:JS工作原理
一 浏览器组成可分两部分:Shell+内核. 浏览器内核又可以分成两部分:渲染引擎(layout engineer或者Rendering Engine)和JS引擎. 渲染引擎功能作用 渲染引擎,负责对 ...
- LNMP环境配置SSL证书 lnmp ssl add
.4新增的添加SSL功能 lnmp ssl add 如果需要添加输入 y ,不添加输入 n 回车. 选择了添加SSL会提示 有两个选项,1 选项为使用自己准备好的SSL证书和key. > &g ...
- 利用javascript实现页面截图
html2canvas可以通过纯JS对浏览器端经行截屏,但截图的精确度还有待提高,部分css不可识别,所以在canvas中不能完美呈现原画面样式 兼容性: Firefox 3.5+ Google Ch ...
- 使用jquery.jqprint.js 实现的打印功能,IE9不能进行打印预览、火狐打印空白界面
提示的内容:SCRIPT438: 对象不支持“ExecWB”属性或方法 首先解决IE9不能打印预览的问题: 查找了一大推资料 ,有两种说法:一种是IE的安全性级别太高:一种是需要安装什么 微软we ...
- svn diff color
大致有两种方式: 1,在bashrc中添加如下脚本 svndiff() { svn diff "${@}" | colordiff } 2,修改svn的配置文件 $ vim ~/. ...
- java poi分批次导入Excel
最近换了新工作,公司要求导入Excel要分批次导入,并且是多线程的情况下执行导入,查了很多资料,没看到比较复合的,就打算自己写一个吧,可能有不足,希望指出. 上面说到多线程,这边就不贴出代码了,具体思 ...
- Java集合详解6:TreeMap和红黑树
Java集合详解6:TreeMap和红黑树 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储 ...
- echarts在miniUI和ajax下动态渲染数据
<script src="echarts.js"></script> <script src="jquery-3.3.1.min.js&qu ...
- 解决在for循环内判断条件多次执行
最近遇到的这个问题,就是在for循环内if判断的条件会多次执行. 例如,在返回的30数据中,a条目是第7条则会进行30次判断,弹出29次查无数据,也就是要点击29次关闭alert,很是让人不爽. 有了 ...