Bzoj4561 [JLoi2016]圆的异或并

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 521  Solved: 224

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

HINT

Source

几何 思路题

圆之间没有交点是一个很好的性质,这保证如果圆A被圆B包含,我们从某个方向扫描的时候一定先扫到圆B。

用set维护一个“括号序列”,对于当前的扫描线x,圆与x靠下的交点记为左括号,靠上的交点记为右括号,查询当前圆在几层括号里,若在奇数层就减去这个圆的面积,否则加上

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<set>
 7 #define LL long long
 8 using namespace std;
 9 const int mxn=200010;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
13     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
14     return x*f;
15 }
16 struct cir{
17     int x,y,r;
18 }c[mxn];
19 struct node{
20     int id;
21     int x,mk;
22 }p[mxn<<1];
23 int tmp,cnt=0;
24 bool operator < (const node &a,const node &b) {
25     double res1=c[a.id].y+a.mk*sqrt((LL)c[a.id].r*c[a.id].r-((LL)tmp-c[a.id].x)*(tmp-c[a.id].x));
26     double res2=c[b.id].y+b.mk*sqrt((LL)c[b.id].r*c[b.id].r-((LL)tmp-c[b.id].x)*(tmp-c[b.id].x));
27     return (res1==res2 && a.mk<b.mk) || (res1<res2);
28 }
29 bool cmp (const node a,const node b){
30     return a.x<b.x;
31 }
32 set<node>st;
33 int n,f[mxn];
34 LL ans=0;
35 int main(){
36     int i,j;
37     n=read();
38     for(i=1;i<=n;i++){
39         c[i].x=read();c[i].y=read();c[i].r=read();
40         p[++cnt]=(node){i,c[i].x-c[i].r,1};
41         p[++cnt]=(node){i,c[i].x+c[i].r,-1};
42     }
43     sort(p+1,p+cnt+1,cmp);
44     for(i=1;i<=cnt;i++){
45         tmp=p[i].x;
46         if(p[i].mk==1){
47             set<node>::iterator it;
48             it=st.upper_bound((node){p[i].id,0,-1});
49             if(it==st.end())f[p[i].id]=1;
50             else{
51                 if( (*it).mk==1 ) f[p[i].id]=-f[(*it).id];
52                 else f[p[i].id]=f[(*it).id];
53             }
54             st.insert((node){p[i].id,0,1});
55             st.insert((node){p[i].id,0,-1});
56         }
57         else{
58             st.erase((node){p[i].id,0,1});
59             st.erase((node){p[i].id,0,-1});
60         }
61     }
62     for(i=1;i<=n;i++){
63         ans+=f[i]*(LL)c[i].r*c[i].r;
64     }
65     printf("%lld\n",ans);
66     return 0;
67 }
时间: 2024-08-05 23:41:24

Bzoj4561 [JLoi2016]圆的异或并的相关文章

【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 仅一行一个整数,表示所有圆的

【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

POJ1584 A Round Peg in a Ground Hole 凸包判断 圆和凸包的关系

POJ1584 题意:给定n条边首尾相连对应的n个点 判断构成的图形是不是凸多边形 然后给一个圆 判断圆是否完全在凸包内(相切也算) 思路:首先运用叉积判断凸多边形 相邻三条变叉积符号相异则必有凹陷 O(n) 之后首先判断圆心是否在凸多边形内 如果凸多边形的点有序 则可以在logn时间内判断 否则先排序再判断 O(nlogn) 然后用每条边(线段)判断到圆心的距离即可 这道题也没给数据范围 O(nlogn)是可以AC的. #include<iostream> #include<stdio

bzoj4558【JLOI2016】方

4558: [JLoi2016]方 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 185  Solved: 78 [Submit][Status][Discuss] Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1)个格点,我们需要做的就是找出这些格点形 成了多少个正方形(换句话说,正方形的四个顶

[北京集训测试赛(五)/HDU5299]圆圈游戏(Circles game)-树上删边-圆的扫描线

Problem 遗产 题目大意 一个平面上n个圆,任两个圆只会相离或包含,给出每个圆位置与半径. alice&&bob轮流取圆,每取一个就可以取出这个圆以及被这个圆包含的圆. 没圆取的人输,alice先取,问谁有必胜策略. Solution Method #1 首先我们考虑一个暴力一点的写法: 先将圆半径从小到大排序,然后枚举两个圆,判断是否包含关系. 如果包含的话就将大圆连一条边到小圆. 很容易发现,这样执行完以后得到了一棵树. 我们接下来要做的事情就变成了: 每个人可以轮流从树上删除一

MT【32】内外圆(Apollonius Circle)的几何证明

另一方面,如果 M 满足(1)式,那么M必然在以PQ为直径的圆上.事实上当M为P或者Q时,这是显然的.当M异于P,Q时,由$\frac{|MB|}{|MC|}=\frac{|PB|}{|PC|}=\lambda,\frac{|MB|}{|MC|}=\frac{|QB|}{|QC|}=\lambda$知MP,MQ分别是$\angle{BMC}$的内角平分线和外交平分线,故$\angle{PMQ}=90^0$,即M在以PQ为直径的圆上. 评:阿式圆因为涉及到内角平分线和外角平分线又称为内外圆,在有些

bzoj4558[JLoi2016]方 容斥+count

4558: [JLoi2016]方 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 452  Solved: 205[Submit][Status][Discuss] Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1)个格点,我们需要做的就是找出这些格点形 成了多少个正方形(换句话说,正方形的四个顶点