【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 ...
随机推荐
- word 里面没输入法
文件,选项,高级,输入法控制处于活动状态 ,有勾选就去掉,无勾选就勾上,确定后重开word即可
- 【题解】 [ZJOI2012]灾难 (拓扑排序+LCA)
懒得复制,戳我戳我 Solution: 这题思路很神奇,首先你要知道这个毁灭树是怎么保证实现的:一句话就是如果该节点要被破坏,他的所有父节点就要被破坏,也就只要所有父节点的LCA被破坏就可以,所以我们 ...
- NOIP2018TG 初赛复习
Date: 20180911 TCP/IP OSI7面向对象的程序设计语言 1.不是自顶向下2.simula 67语言 第一个3.继承性.封装性.多态性NOIP支持的语言环境:对于c / c++ :D ...
- Python Socket函数及说明
- LeetCode 7最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...
- win下jdk7环境变量的配置
win下jdk7环境变量的配置: 单击计算机(Computer),选择属性(Properties),选择高级系统设置(Advanced systems settings), 选择环境变量(Enviro ...
- vue-cli内部webpack的打包优化
在此之前,我们先谈谈前端项目的性能优化. 优化前端项目无非就是2方面的优化: 一.网络性能优化(重点) 减少请求数量(webpack的天职就是打包) 减少请求资源大小(压缩gzip,后端会完成) CD ...
- eclipse启动tomcat内存溢出的解决方式
eclipse启动tomcat内存溢出的解决方式 ——IT唐伯虎 摘要:eclipse启动tomcat内存溢出的解决方式. 1.打开Run Configurations 2.在VM arguments ...
- SQL记录-PLSQL数组
PL/SQL数组 PL/SQL程序设计语言提供叫一种叫做VARRAY的数据结构,其可存储相同类型元素的一个固定大小的连续集合.VARRAY用于存储数据的有序集合,但它往往是更加有用认为数组作为相同类型 ...
- node.js+express,实现RESTful API
node代码如下(exptest.js): var express = require('express'); var bodyParser = require('body-parser'); var ...