bzoj 4561: [JLoi2016]圆的异或并
Description
在平面直角坐标系中给定N个圆。已知这些圆两两没有交点,即两圆的关系只存在相离和包含。求这些圆的异或面
积并。异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑。
Solution
我们可以把异或当作容斥的一个过程....现在要确定每一个圆的系数.
由于不存在相交关系 , 圆与圆之间相对顺序是确定的 , 所以可以用 \(set\) 来维护相对顺序.
我们对 \(x\) 做扫描线来维护一个圆的插入和删除.
我们把一个圆拆成上下两个圆弧 , 新插入一个圆时 , 判断上面的第一个圆弧是上圆弧还是下圆弧.
容易发现 : 如果是上圆弧那么系数相反 , 如果是下圆弧则相同.
求出每个圆的系数 , 最后累加答案就行了.
注意一个细节 , 上下圆弧 \(y\) 相同时 , 要把下圆弧放在下面...
#include<bits/stdc++.h>
#define sqr(x) (1ll*(x)*(x))
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=200010;
int n,f[N],y[N],r[N],X,x[N];
struct data{int id,k;}q[N*2];
inline bool operator <(data p,data q){
return x[p.id]+r[p.id]*p.k<x[q.id]+r[q.id]*q.k;
}
struct node{int id,k;};
inline bool operator <(node p,node q){
double y1=y[p.id]+p.k*sqrt(sqr(r[p.id])-sqr(X-x[p.id]));
double y2=y[q.id]+q.k*sqrt(sqr(r[q.id])-sqr(X-x[q.id]));
if(y1<y2)return 1;if(y1>y2)return 0;
return p.k<q.k;
}
set<node>S;
set<node>::iterator it;
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++){
gi(x[i]),gi(y[i]),gi(r[i]);
q[++cnt]=(data){i,-1},q[++cnt]=(data){i,1};
}
sort(q+1,q+cnt+1);
for(int i=1;i<=cnt;i++){
X=x[q[i].id]+q[i].k*r[q[i].id];
if(q[i].k==-1){
int x=q[i].id;
node t1=(node){x,1},t2=(node){x,-1};
it=S.lower_bound(t1);
if(it!=S.end()){
if(it->k>0)f[x]=-f[it->id];
else f[x]=f[it->id];
}
else f[x]=1;
S.insert(t1),S.insert(t2);
}
else S.erase((node){q[i].id,1}),S.erase((node){q[i].id,-1});
}
long long ans=0;
for(int i=1;i<=n;i++)ans+=1ll*f[i]*r[i]*r[i];
cout<<ans;
return 0;
}
bzoj 4561: [JLoi2016]圆的异或并的更多相关文章
- BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线
扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...
- BZOJ 4561: [JLoi2016]圆的异或并 扫描线 + set
看题解看了半天...... Code: #include<bits/stdc++.h> #define maxn 200010 #define ll long long using nam ...
- 【BZOJ】4561: [JLoi2016]圆的异或并
题解 我们把圆拆成两个圆弧,按照圆弧的左右端点排序来增加和删除 那么我们把圆弧按照纵坐标排序,一定是两两不相交的 我们新加入一个圆的时候,找上圆弧的前驱,如果前驱是一个上圆弧,那么这个上圆弧所在的圆就 ...
- bzoj4561: [JLoi2016]圆的异或并 圆的扫描线
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4561 题目: 4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec ...
- BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*
BZOJ4561 JLoi2016 圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区 ...
- 【BZOJ4561】[JLoi2016]圆的异或并 扫描线
[BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一 ...
- bzoj4561: [JLoi2016]圆的异或并
Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
- [JLOI2016]圆的异或并
Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆 ...
- BZOJ4561 JLOI2016圆的异或并(扫描线+平衡树)
考虑一条扫描线从左到右扫过这些圆.观察某一时刻直线与这些圆的交点,可以发现构成一个类似括号序列的东西,括号的包含关系与圆的包含关系是相同的.并且当扫描线逐渐移动时,括号间的相对顺序不变.于是考虑用se ...
随机推荐
- 使用 Apache Atlas 进行数据治理
本文由 网易云发布. 作者:网易/刘勋(本篇文章仅限知乎内部分享,如需转载,请取得作者同意授权.) 面对海量且持续增加的各式各样的数据对象,你是否有信心知道哪些数据从哪里来以及它如何随时间而变化?采 ...
- 和我一起学python
近来python越来越火,很多人都出了教程,我也来出一个凑凑热闹吧. pycharm激活 http://idea.lanyus.com/ https://blog.csdn.net/u01404481 ...
- codeforces 1096 题解
A: 发现最优的方案一定是选 $ l $ 和 $ 2 * l $,题目保证有解,直接输出即可 #include <bits/stdc++.h> #define Fast_cin ios:: ...
- 十招谷歌 Google 搜索
十招谷歌搜索 一.或者 OR 二.网址 insite:example.com keyword 三.大约 1.类似查询(记得) ~keyword 2.模糊查询(记得) key*****word 3.模糊 ...
- set,env和export命令显示shell变量其区别,与环境变量扫盲(一)
种类: ♦ set : 用来显示本地变量,显示当前shell的变量,包括当前用户的变量 ♦ env : 用来显示环境变量,显示当前用户的变量. ♦ export: 用来显示和设置环 ...
- psp0级报告
计划 1.1需求描述: 现在市场上有很多的面向小学生的题卡,但是这习题卡不但价格昂贵,而且每次做题的内容基本都是固定.针对这些问题,开发出了这款网页在线答题系统,每次的题目都有所不同,可以跟快更好提高 ...
- 基于wavesurfer.js的超大音频的渐进式请求实现
最近在对超大音频的渐进式请求实现上面消耗了不少时间,主要是因为一对音频的基本原理不太理解,二刚开始的时候太依赖插件,三网上这块的资料找不到只能靠自己摸索.由于交互复杂加上坑比较多,我怕描述不清,这里主 ...
- js 移动端获取当前用户的经纬度
一.HTML5 geolocation的属性 if(navigator.geolocation){ navigator.geolocation.getCurrentPosition(onSuccess ...
- word中手动添加endnote的加载项
用Endnote管理文献,在写作的同时插入引文,这对于写文章的朋友们来说太重要了.我今天遇到这个问题,花时间钻研了,觉得应该记录下来,相信也会方便大家.查了网上许多帖子依然不得解,可能是Word版本变 ...
- windows 虚拟机VMware 安装linux系统注意事项!!!
1.主机CPU是否支持虚拟化技术? 启动 CPUZ 软件(如下图) 注: 32位系统查看使用CPUZ_x86软件 64位系统查看使用CPUZ_x64软件 启动后 ...