计数方法(扫描线):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 Input

2

0 0 1

0 0 2

Sample Output

3

  这道题是模板题,经典题。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <set>
 7
 8 #include <cassert>
 9 using namespace std;
10 const int N=200010,M=600010;
11 int n,px[N],py[N],r[N],top,T;
12 long long sqr(long long a){return a*a;}
13 struct Point{
14     int id,x,tp;
15     friend bool operator<(Point x,Point y){
16         double a=py[x.id]+x.tp*sqrt(sqr(r[x.id])-sqr(T-px[x.id]));
17         double b=py[y.id]+y.tp*sqrt(sqr(r[y.id])-sqr(T-px[y.id]));
18         if(a!=b)return a<b;assert(x.id==y.id);return x.tp<y.tp;
19     }
20 }st[M];
21 bool cmp(Point a,Point b){
22     return a.x<b.x;
23 }
24 int res[N];
25 set<Point>s;
26 set<Point>::iterator it;
27 long long ans;
28
29
30 int main(){
31     freopen("circle.in","r",stdin);
32     freopen("circle.out","w",stdout);
33     scanf("%d",&n);
34     for(int i=1;i<=n;i++){
35         scanf("%d%d%d",&px[i],&py[i],&r[i]);
36         st[++top]=(Point){i,px[i]-r[i],1};
37         st[++top]=(Point){i,px[i]+r[i],-1};
38     }
39
40     sort(st+1,st+top+1,cmp);
41     for(int i=1;i<=top;i++){
42         Point x=st[i];T=x.x;
43         if(x.tp==1){
44             it=s.upper_bound((Point){x.id,0,1});
45             if(it==s.end())res[x.id]=1;
46             else{
47                 Point y=*it;
48                 if(y.tp==1)res[x.id]=-res[y.id];
49                 else res[x.id]=res[y.id];
50             }
51             s.insert((Point){x.id,0,-1});
52             s.insert((Point){x.id,0,1});
53         }
54         else{
55             s.erase((Point){x.id,0,-1});
56             s.erase((Point){x.id,0,1});
57         }
58     }
59     for(int i=1;i<=n;i++)
60         ans+=res[i]*sqr(r[i]);
61     printf("%lld\n",ans);
62     return 0;
63 }
时间: 2024-08-25 08:31:04

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

【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行,

数学基础——基本计数方法

计数方法最基础的两个原理是:加法原理和乘法原理. 容斥原理: 假设一个班里有10个学生喜欢数学,15个学生喜欢语文,21个学生喜欢编程.那么班级总人数: |A∪B∪C| = |A| + |B| + |C| - |A∩B| - |A∩C| - |B∩C| + |A∩B∩C| 一般的,任意多个集合,集合内的元素个数为奇数,前面的符号为正. 问题1:排列问题 n个不同的数,选k个排成1排,有多少种排法. 答案计做p(n,k) = n*(n-1)*(n-2)*...*(n-(k-1)) = n!/(n-

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|,≤

学习总结--数学.基本计数方法

学习总结--数学.基本计数方法 一.计数方法的原理 1.加法原理:做一件事情有n中办法,第i种办法有pi种执行方案,那么总的解决这件事情的方案数即为p1+p2+p3+...+pn. 2.乘法原理:做一件事情分为n个步骤,第i个步骤的执行方案有pi种,则一共有p1?p2?p3?...?pn种方案解决该问题. 3.容斥原理:一个班级有,集合A的人喜欢数学,集合B的人喜欢英语,结合C的人喜欢语文,那么该班级的人数应该是多少? 如果我们将三个集合的人数相加起来,那么就重复计算了既喜欢数学又喜欢英语的.既

计数方法,博弈论(扫描线,树形SG):HDU 5299 Circles Game

There are n circles on a infinitely large table.With every two circle, either one contains another or isolates from the other.They are never crossed nor tangent.Alice and Bob are playing a game concerning these circles.They take turn to play,Alice go

动态规划(计数DP):JLOI 2016 成绩比较

Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M- 1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数.如果在每门课上A获得的成绩均小于等于B获 得的成绩,则称A被B碾压.在B神的说法中,G系共有K位同学被他碾压(不包括他自己),而其他N-K-1位同学则没 有被他碾压.D神查到了B神每门必修课的排名.这里的排名是指:如果B神某门课的排名为R,则表示有且仅有R-1 位同学这门课的分数大于B神的分数

【组合数学】 05 - 经典计数方法

1. 基本计数的母函数 现在来用母函数来求解基本计数问题,母函数既可以完成自动计数,还能表示计数本身,像Stirling数这种就只能用母函数表示.自动计数适用于可以分步的计数问题,并且目标值是每步值之和,这与多项式的运算性质有关. 1.1 组合数和分划数 直观上最符合这一特点的就是模型2,从\(n\)个可区别对象中选出\(m个\).限制第\(k\)个对象被取的次数在集合\(M_k\)中,它被选情况的母函数是\(\sum\limits_{i\in M_k}x^i\),所有元素被选择的情况可以借助母

算法竞赛入门经典行训练指南【计数方法】------2015年1月23日

基础知识整理: (1)加法原理 (2)乘法原理 (3)容斥原理(注意变式问题) (4)排列组合公式的应用及变形: 排列的公式: 其变形为: 与组合的关系如下(以下第一个公式很重要): 排列组合公式的重要推论: 推论1: 对于第一个物体如果不取的话,那么我们有C(n,k+1)种方法,对于第一个物体取的话,我有C(n,k)种方法.公式得证. 推论2: 这可以降低求解二项式系数的时间复杂度,通过利用递推关系自小到大依次计算得出,方便快捷. (5)排列组合的基本问题: Q1:求有重复元素的排列. 有k个