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

【BZOJ4561】[JLoi2016]圆的异或并

Description

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

Input

第一行包含一个正整数N,代表圆的个数。接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的圆。保证|x|,|y|,≤10^8,r>0,N<=200000

Output

仅一行一个整数,表示所有圆的异或面积并除以圆周率Pi的结果。

Sample Input

2
0 0 1
0 0 2

Sample Output

3

题解:首先有一个非常重要的性质,由于所有圆不相交,所以任何时候所有圆的相对位置是不变的。

然后,我们对将个圆拆成加入和删除两个事件,左边加入右边删除。加入时相当于在set中加入了上下两个圆弧。然后用扫描线从左到右扫描,当加入一个圆时,在set中找到它外面的一层圆,则当前圆的符号=-外层圆的符号。特别地,如果我们在当前圆的上面找到了一个下半圆,则说明它和那个圆的关系是并列的,所以符号相同。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <cmath>
using namespace std;
const int maxn=200010;
typedef long long ll;
int n,now;
int x[maxn],y[maxn],r[maxn],f[maxn];
ll ans;
struct edgex
{
	int v,k;
	edgex() {}
	edgex(int a,int b){v=a,k=b;}

}p[maxn<<1];
bool operator < (edgex a,edgex b)
{
	int pa=x[a.v]+a.k*r[a.v],pb=x[b.v]+b.k*r[b.v];
	return pa<pb;
}
struct edgey
{
	int v,k;
	edgey() {}
	edgey(int a,int b){v=a,k=b;}
	double gety()
	{
		return y[v]+k*sqrt(1.0*r[v]*r[v]-1.0*(x[v]-now)*(x[v]-now));
	}
};
bool operator < (edgey a,edgey b)
{
	double ya=a.gety(),yb=b.gety();
	if(fabs(ya-yb)<1e-7)	return a.k<b.k;
	return ya<yb;
}
set<edgey> s;
set<edgey>::iterator it;
int rd()
{
	int ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+gc-‘0‘,gc=getchar();
	return ret*f;
}
int main()
{
	n=rd();
	int i;
	for(i=1;i<=n;i++)	x[i]=rd(),y[i]=rd(),r[i]=rd(),p[i]=edgex(i,-1),p[i+n]=edgex(i,1);
	sort(p+1,p+2*n+1);
	for(i=1;i<=2*n;i++)
	{
		if(p[i].k==-1)
		{
			edgey t1(p[i].v,-1),t2(p[i].v,1);
			it=s.upper_bound(t2);
			if(it!=s.end())	f[p[i].v]=-f[(*it).v];
			else	f[p[i].v]=1;
			s.insert(t1),s.insert(t2);
		}
		else	s.erase(edgey(p[i].v,-1)),s.erase(edgey(p[i].v,1));
	}
	for(i=1;i<=n;i++)	ans+=(ll)f[i]*r[i]*r[i];
	printf("%lld",ans);
	return 0;
}
时间: 2024-11-04 07:59:34

【BZOJ4561】[JLoi2016]圆的异或并 扫描线的相关文章

Bzoj4561 [JLoi2016]圆的异或并

Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 521  Solved: 224 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的 圆.保证|x|,|y|,≤

【BZOJ-4561】圆的异或并 set + 扫描线

4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 254  Solved: 118[Submit][Status][Discuss] Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,

计数方法(扫描线):JLOI 2016 圆的异或并

Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的 圆.保证|x|,|y|,≤10^8,r>0,N<=200000 Output 仅一行一个整数,表示所有圆的异或面积并除以圆周率Pi的结果. Sample

lyc的进程表

"少壮不努力,AK IOI."--RLD 2018/8/10 Prime Distance On Tree 和聪聪可可一样是点分治的计数题 但是合并信息是$ O( n ^ 2 ) $的,会炸,FFT可以加速. #include<bits/stdc++.h> using namespace std; #define gc c=getchar() #define r(x) read(x) #define ll long long #define db double #defin

扫描线题目汇总 (里面的题解和代码非原创)

hdu 3867 Light and Shadow 转载自:http://blog.csdn.net/accry/article/details/6676009 题意: 原子弹爆炸,一些互不相交的线段,求能辐射到的线段个数(可以将原子弹爆炸点视为泛光源) 分析: 以辐射源为中心对周围的点按照极坐标角度进行排序,然后在极坐标上使用扫描线方法.维护一个集合,集合内的元素是与扫描线相交的线段,排序依据是线段与扫描线的交点到辐射源的距离.该集合中的最小元素就是被照射到的线段. 有关容器(set)排序依据

训练日志

计算几何学习进入了一个瓶颈啊 = = 有些偏难的东西进展很缓慢 加上最近做题类型确实单一 导致比赛的时候经常写跪 所以打算慢慢进展计算几何内容 每天都做一些常规的水题 先说下计算几何的情况 进入了扫描线部分 和之前普通的矩形周长并啥的画风完全不同了 目前搞出来的东西也挺少 HDU 3124 给你一些平面上不相交的圆 圆上的点的最近距离 平面最近点对有固定套路 但是放到圆上还有半径 不能套用(但据说现场有人考最近点对的做法搞过去了?) 求最近距离 考虑二分 剩下的就是快速判断圆是否相交 我们考虑扫

bzoj4642: 泡泡

Description "OI真的像是一条奇趣横生的路啊,也许它是绕过了高考的大山,也许确实有通往大学的捷径.但我,真的,真的只在 乎那路上美丽的泡泡." --TB TB喜欢所有自然的事物.比如说松爷的仙人掌,Picks的多项式导论,当然,还有OI路上美丽的泡泡.这些泡泡可 以视作某一平面上的一些圆.由于泡泡的特殊性质,当两个泡泡在这一平面上相切的时候,TB认为这对泡泡是自然 的,然而如果它们相交或者包含的话,泡泡就会破裂而无法继续存在(即不会存在相交或包含的情况).TB想知道 有多少

3D场景的制作步骤

2.4   3D场景的制作步骤 1. 场景建模的使用目的 使用地形生成编辑器在模拟自然地形效果上有很大的优势,但是也有局限性.在表现比较规整的地形,比如一现代化城市,初具规模的小镇,地下宫殿等等就存在这样的局限.因为使用地形编辑器建立地形时,地表贴图的数量不能太多,选择的地表贴图的数量越多游戏的运行效率就越低,适合选择2-3张贴图.而城市中的地面上所需要的贴图会非常多,车行道.人行道.草坪等远不止三张,而且城镇的街道是非常规整的,这是地形生成编辑器不能做到的.还有很重要的一点,就是用这种方法制作

2020.1.2考试总结

T1圆圈游戏 暴力DP有60分,设包含圆i的最小的圆是fa[i],那没最终会的得到一棵树,对于一棵子树,选了根节点就不能选子树内其它点,f[i]=max(w[i],\(\sum f[son]\)). 瓶颈就在怎么建图,因为圆不相交相切,所以扫描线的时候相对位置不会发生改变,用set维护一下就好啦. #include<algorithm> #include<iostream> #include<cmath> #include<queue> #include&l