【BZOJ】4561: [JLoi2016]圆的异或并
题解
我们把圆拆成两个圆弧,按照圆弧的左右端点排序来增加和删除
那么我们把圆弧按照纵坐标排序,一定是两两不相交的
我们新加入一个圆的时候,找上圆弧的前驱,如果前驱是一个上圆弧,那么这个上圆弧所在的圆就是半径最小且包含它的圆,如果前驱是一个下圆弧,那么包含这个下圆弧的圆就是包含当前圆的圆
然后构建出一棵树,记录一下每个节点的深度就可以了
我们其实可以通过更改外部变量更改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]圆的异或并的更多相关文章
- bzoj 4561: [JLoi2016]圆的异或并
Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
- BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线
扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...
- BZOJ 4561: [JLoi2016]圆的异或并 扫描线 + set
看题解看了半天...... Code: #include<bits/stdc++.h> #define maxn 200010 #define ll long long using nam ...
- 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 ...
随机推荐
- 【转】ubuntu 12.04下如何开启 NFS 服务 & 设置
在嵌入式Linux开发中,利用NFS服务从开发板访问Linux主机是个高效&方便的调试方法,在程序调试过程中可以避免多次下载程序到开发板.但这需要在Linux主机上首先开通NFS服务. 以ub ...
- 关于找List的中间Node
初始值 slow = fast = head; 如果使用 fast && fast->next && fast->next->next 作为快慢指针循 ...
- GO内存管理
TMalloc模型 http://www.360doc.com/content/16/0811/09/14513665_582407916.shtml http://blog.csdn.net/cho ...
- svn cleanup
SVN 本地更新时,由于一些操作中断更新,如磁盘空间不够,用户取消. 可能会造成本地文件被锁定的情况.一般出现这种情况的解决方法: 1.可以使用SVN clean up来清除锁定. 2.如果不是本目录 ...
- 【转】Android 编程下的代码混淆
什么是代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.代码混淆可以用于程序源代码,也可以用于程序编译而成的中 ...
- django模板中的自定义过滤器
(1)在APP下创建templatetags文件夹,与Models.py.views.py等同级,templatetags文件夹下添加__init__.py文件,可为空,再添加一个模块文件,例如cpt ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- MySQL日志功能详解
MySQL日志功能详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询日志 它是用来保存所有跟查询相关的日志,这种日志类型默认是关闭状态的,因为MySQL的用户有很多,如果 ...
- disabled属性对form表单向后台传值的影响
在form表单里,如果对input加入disabled="disabled"或disabled="true"等属性,form表单提交的时候,就不会传值到后台. ...
- 浅谈fhq treap
一.简介 fhq treap 与一般的treap主要有3点不同 1.不用旋转 2.以merge和split为核心操作,通过它们的组合实现平衡树的所有操作 3.可以可持久化 二.核心操作 代码中val表 ...