【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 ...
随机推荐
- (NOI2014)(bzoj3669)魔法森林
LCT裸题,不会的可以来这里看看. 步入正题,现将边按a排序,依次加入每一条边,同时维护路径上的最小生成树上的最大边权,如果两点不连通,就直接连通. 如果两点已经连通,就将该边与路径上较小的一条比较, ...
- 【CF912E】Prime Game(meet in the middle)
[CF912E]Prime Game(meet in the middle) 题面 CF 懒得翻译了. 题解 一眼题. \(meet\ in\ the\ middle\)分别爆算所有可行的两组质数,然 ...
- bzoj2817[ZJOI2012]波浪
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2817 波浪 [问题描述] 阿米巴和小强是好朋友. 阿米巴和小强在大海旁边看海水的波涛.小 ...
- Django中简单添加HTML、css、js等文件(非正规添加,适合小白)
Django中简单添加HTML.css.js等文件 首先申明下自己的环境, python版本3.65(亲测3.7版本有毒,没解决掉!) Django版本1.11.15(版本比较成熟,也可以用最新的版本 ...
- ELKStack-生产案例项目实战(十一)
ELKStack-生产案例项目实战 1.收集ES和apache日志,入redis input { file { path => "/etc/httpd/logs/access_log& ...
- C#的Struct
- mybatis 不整合spring 入门小例子
先上一个搭建完的项目结构截图: 相对比较重要的配置文件有 db.properties , SqlMappingConfig.xml , mapper/User.xml , log4j.properti ...
- VMware Linux 下 Nginx 安装配置 - Tomcat 配置 (二)
准备工作 相关浏览: VMware Linux 下 Nginx 安装配置 (一) 1. 选在 /usr/local/ 下创建 softs 文件夹,通过 ftp 命令 把 apache-tomcat-7 ...
- Linux - seq 预设外部命令
seq 是Linux 中一个预设的外部命令,一般用作一堆数字的简化写法. 常用参数: # 不指定起始数值,则默认为 1 -s # 选项主要改变输出的分格符, 预设是 \n -w # 等位补全,就是宽度 ...
- Linux 并发链接数
并发数查看 查看 TCP 协议连接数 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' SYN_RECV # ...