题解

我们把圆拆成两个圆弧,按照圆弧的左右端点排序来增加和删除

那么我们把圆弧按照纵坐标排序,一定是两两不相交的

我们新加入一个圆的时候,找上圆弧的前驱,如果前驱是一个上圆弧,那么这个上圆弧所在的圆就是半径最小且包含它的圆,如果前驱是一个下圆弧,那么包含这个下圆弧的圆就是包含当前圆的圆

然后构建出一棵树,记录一下每个节点的深度就可以了

我们其实可以通过更改外部变量更改set的计算方式

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {putchar('-');x = -x;}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
db X;
struct Arc {
db x,y,r,on;int id;
friend bool operator < (const Arc &a,const Arc &b) {
db ay = a.on * sqrt(a.r * a.r - (X - a.x) * (X - a.x)) + a.y;
db by = b.on * sqrt(b.r * b.r - (X - b.x) * (X - b.x)) + b.y;
if(ay != by) return ay > by;
else return a.on > b.on;
}
};
struct circle {
int64 x,y,r;
}C[MAXN];
int N,fa[MAXN],tot,dep[MAXN];
vector<int> son[MAXN];
pii p[MAXN * 2];
multiset<Arc> S;
void Init() {
read(N);
for(int i = 1 ; i <= N ; ++i) {
read(C[i].x);read(C[i].y);read(C[i].r);
}
for(int i = 1 ; i <= N ; ++i) {
p[++tot] = mp(C[i].x - C[i].r,i);
p[++tot] = mp(C[i].x + C[i].r,i);
}
sort(p + 1,p + tot + 1);
}
void dfs(int u) {
int s = son[u].size();
for(int i = 0 ; i < s ; ++i) {
dep[son[u][i]] = dep[u] + 1;
dfs(son[u][i]);
}
}
void Solve() {
for(int i = 1 ; i <= tot ; ++i) {
int t = p[i].se;
X = p[i].fi;
if(p[i].fi == C[t].x - C[t].r) {
multiset<Arc>::iterator k = S.insert((Arc){(db)C[t].x,(db)C[t].y,(db)C[t].r,1,t});
if(k != S.begin()) {
--k;
if((*k).on > 0) fa[t] = (*k).id;
else fa[t] = fa[(*k).id];
}
S.insert((Arc){(db)C[t].x,(db)C[t].y,(db)C[t].r,-1,t});
}
else {
S.erase((Arc){(db)C[t].x,(db)C[t].y,(db)C[t].r,1,t});
S.erase((Arc){(db)C[t].x,(db)C[t].y,(db)C[t].r,-1,t});
}
}
for(int i = 1 ; i <= N ; ++i) son[fa[i]].pb(i);
int64 ans = 0;
dfs(0);
for(int i = 1 ; i <= N ; ++i) {
if(dep[i] & 1) ans += C[i].r * C[i].r;
else ans -= C[i].r * C[i].r;
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}

【BZOJ】4561: [JLoi2016]圆的异或并的更多相关文章

  1. bzoj 4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  2. BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线

    扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...

  3. BZOJ 4561: [JLoi2016]圆的异或并 扫描线 + set

    看题解看了半天...... Code: #include<bits/stdc++.h> #define maxn 200010 #define ll long long using nam ...

  4. bzoj4561: [JLoi2016]圆的异或并 圆的扫描线

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4561 题目: 4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec ...

  5. BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*

    BZOJ4561 JLoi2016 圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区 ...

  6. 【BZOJ4561】[JLoi2016]圆的异或并 扫描线

    [BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一 ...

  7. bzoj4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  8. [JLOI2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆 ...

  9. BZOJ4561 JLOI2016圆的异或并(扫描线+平衡树)

    考虑一条扫描线从左到右扫过这些圆.观察某一时刻直线与这些圆的交点,可以发现构成一个类似括号序列的东西,括号的包含关系与圆的包含关系是相同的.并且当扫描线逐渐移动时,括号间的相对顺序不变.于是考虑用se ...

随机推荐

  1. 5月14日 绿城育华NOIP巨石杯试卷解析

    [题外话] 感谢UBUNTU为保存程序做出贡献:https://paste.ubuntu.com : 感谢洛谷OJ的私人题库保存题面:https://www.luogu.org : 现在我的题解的所有 ...

  2. 前端学习 -- Css -- 文档流

    文档流 文档流处在网页的最底层,它表示的是一个页面中的位置, 我们所创建的元素默认都处在文档流中 元素在文档流中的特点 块元素 块元素在文档流中会独占一行,块元素会自上向下排列. 块元素在文档流中默认 ...

  3. Django中简单添加HTML、css、js等文件(非正规添加,适合小白)

    Django中简单添加HTML.css.js等文件 首先申明下自己的环境, python版本3.65(亲测3.7版本有毒,没解决掉!) Django版本1.11.15(版本比较成熟,也可以用最新的版本 ...

  4. HDU 6156 数位dp

    Palindrome Function Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Ot ...

  5. NB-IoT 的“前世今生”

    作者:个推B2D研发工程师 海晏 根据<爱立信2018移动报告>(Ericsson Mobility Report,June 2018)的预测,蜂窝物联网设备连接数将在2023年达到35亿 ...

  6. Vue单页面应用阻止浏览器记住密码

    Vue单页面应用阻止浏览器记住密码 ——IT唐伯虎 摘要: Vue单页面应用阻止浏览器记住密码. 现象1:路由切换时再次提示“是否记住密码” 登录页面有个密码输入框,输入账号密码进行登录: 登录完成后 ...

  7. nodemon:让node自动重启

    nodemon:服务器自动重启工具 当我们修改代码时,node必须要手动重启,但可以按照nodemon. npm install -g nodemon 安装完 nodemon 后,就可以用 nodem ...

  8. Codeforces 314 E. Sereja and Squares

    http://codeforces.com/contest/314/problem/E 题意: 原本有一个合法的括号序列 擦去了所有的右括号和部分左括号 问有多少种填括号的方式使他仍然是合法的括号序列 ...

  9. Your Prediction Gets As Good As Your Data

    Your Prediction Gets As Good As Your Data May 5, 2015 by Kazem In the past, we have seen software en ...

  10. Redis实战(八)Redis的配置文件介绍

    https://www.cnblogs.com/ysocean/p/9074787.html