【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;
}

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

  1. [BZOJ4561][JLOI2016]圆的异或并(扫描线)

    考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变. 将每个圆拆成两边,左端加右端删.每次加圆时考虑它外面最内层的括号属于谁.用se ...

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

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

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

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

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

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

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

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

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

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

  7. BZOJ4561: [JLoi2016]圆的异或并 计算几何+treap

    因为本题保证两圆之间只有相包含或相离(不用担心两圆重合 因为我没有RE) 所以每个圆之间的相对位置是确定的  也就是可以按极角排序的, 所以可以按横坐标排序后 扫描同时用treap维护加圆删圆(即遇到 ...

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

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

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

    4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 254  Solved: 118[Submit][Statu ...

随机推荐

  1. Mondriaan's Dream(poj 2411)

    题意:在n*m的方格里铺1*2的骨牌,有多少种方案 /* 第一次做插头DP,感觉和状压差不多. 这道题是利用上一行的状态来更新下一行的状态. 1代表上一行这个位置填了一个竖的(即本行可以填): 0代表 ...

  2. 阿狸的打字机(bzoj 2434)

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

  3. SharePoint 2013 Custom MasterPage

    <%@Master language="C#"%> <%@ Register Tagprefix="SharePoint" Namespace ...

  4. 【CF711C】Coloring Trees(DP)

    题意:给你n个数字,一共有m种,如果某数为0则该数为空,空的地方可以填任意种类数,但每填一个数字都要花费一定的费用, 从头到尾,所有相邻且相同的数字看作一个集合,求使n个数字的集合数为k所需的最小费用 ...

  5. mkdir(): No such file or directory

    mkdir(): No such file or directory php创建目录时提示没有文件或目录, (1)先检查目录权限: (2)细看mkdir()的用法: 定义和用法: mkdir() 函数 ...

  6. yii 数据库添加,修改,删除相关操作总结

    yii中关于数据信息的添加数据,修改数据,删除数据的相关操作,刚刚学习没几天,仅记录了一些,以后慢慢再充实,有需要的朋友可以看看. 添加数据的方法 (1)save 方法(对象形式操作) $user=n ...

  7. POJ 2577: Interpreter

    简略解题报告 Description A certain computer has 10 registers and 1000 words of RAM. Each register or RAM l ...

  8. poj 3308(二分图的点权最小覆盖)

    Paratroopers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8325   Accepted: 2502 Desc ...

  9. Reveal.js演讲幻灯片框架

    摘要 还需学习参考的链接  https://www.tuicool.com/articles/2AFFj2j 无意中看到这个插件,很喜欢,可以作用在演讲ppt,幻灯片,用户指引上等.代码简单,易维护 ...

  10. 使用Naive Bayes从个人广告中获取区域倾向

    RSS源介绍:https://zhidao.baidu.com/question/2051890587299176627.html http://www.rssboard.org/rss-profil ...