Description

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

Input

输入文件的第一行包含一个正整数n,表示泡泡的个数。
接下来n行,每行三个整数x,y,r,表示一个泡泡的圆心和半径。
对于所有数据,|x|,|y|,r<=10^9, n<=500000
数据保证所有的泡泡都是存在的,既不会出现相交或者包含的关系。

Output

一行,表示有多少对自然的泡泡。
首先旋转坐标系避免一些特判

用扫描线处理,由于圆互不包含/相切,扫描线上用平衡树维护线上圆的y坐标

当线上新增加一个圆时,检查y坐标在其上/下的圆是否与其相切

当线上删除一个圆时,检查y坐标在其上、下的两圆是否相切

以上两个判定可能重复,最后要去重

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
typedef long double ld;
const ld _0=1e-,_s=std::sin(0.43415),_c=std::cos(0.43415);
int ans=;
struct cir{
ld x,y,r;
}cs[];
struct event{
ld x;
int id,type;
}es[];
std::pair<int,int>as[];
int ap=;
bool operator<(event a,event b){
return a.x<b.x;
}
struct cmp{bool operator()(int x,int y){return cs[x].y<cs[y].y;}};
std::set<int,cmp>line;
void chk(int a,int b){
ld x=cs[a].x-cs[b].x,y=cs[a].y-cs[b].y;
if(std::fabs(std::sqrt(x*x+y*y)-cs[a].r-cs[b].r)<_0){
if(a>b){int c=a;a=b;b=c;}
as[ap++]=std::make_pair(a,b);
}
}
int main(){
int n=_int();
for(int i=;i<n;i++){
int x,y,r;
scanf("%d%d%d",&x,&y,&r);
cs[i].x=_c*x+_s*y;
cs[i].y=-_s*x+_c*y;
cs[i].r=r;
es[i<<]=(event){cs[i].x-cs[i].r,i,};
es[i<<^]=(event){cs[i].x+cs[i].r,i,};
}
n<<=;
std::sort(es,es+n);
for(int i=;i<n;i++){
event w=es[i];
if(w.type){
std::set<int,cmp>::iterator it=line.upper_bound(w.id);
if(it!=line.end())chk(*it,w.id);
if(it!=line.begin())--it,chk(*it,w.id);
line.insert(w.id);
}else{
std::set<int,cmp>::iterator it=line.find(w.id);
if(it!=line.begin()){
int a=*--it;++it;++it;
if(it!=line.end())chk(*it,a);
--it;
}
line.erase(it);
}
}
std::sort(as,as+ap);
if(ap)ans=;
for(int i=;i<ap;i++)if(as[i]!=as[i-])++ans;
printf("%d\n",ans);
return ;
}

bzoj4642: 泡泡的更多相关文章

  1. 一个仿windows泡泡屏保的实现

    一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...

  2. BZOJ 1034 泡泡堂BNB 贪心+简单博弈

    同样是今天做bzoj时做到的,感觉能力范围之内的就做了,也是蛮简单的 1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec Memory Limit: 162 MB Su ...

  3. 【BZOJ1034】[ZJOI2008]泡泡堂BNB 贪心

    Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵 ...

  4. 气球或者泡泡向上飘动 jQuery插件

    圣诞.元旦要来了,公司以往基本每个月至少要搞一两款手机小游戏来宣传产品,这次也不例外!! 之前做过,按压柚子.许愿.吃柚子等等小游戏,这次是做个那种 气球向上飘动,戳破气球,随机获取奖品.如下图: 手 ...

  5. BZOJ1034 [ZJOI2008]泡泡堂BNB

    Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表 队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对 ...

  6. 【BZOJ】【1034】【ZJOI2008】泡泡堂BNB

    贪心 类似田忌赛马策略的一个贪心= = 随便YY了一个做法居然A了…… 简单来说就是先强对强,弱对弱,能赢就赢,不能赢就让弱的那个去对强的那个,剩下的人继续依次捉对比赛(继续刚刚的策略),现在人数还是 ...

  7. 泡泡堂、QQ堂游戏通信架构分析

    http://blog.csdn.net/sodme/article/details/468327#comments ————————————————————————————————————————— ...

  8. 1034: [ZJOI2008]泡泡堂BNB - BZOJ

    Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵 ...

  9. ZJOI2008泡泡堂BNB

    1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1305  Solved: 676[Submit][Sta ...

随机推荐

  1. Qt之QCheckBox

    简述 QCheckBox继承自QAbstractButton,它提供了一个带文本标签的复选框. QCheckBox(复选框)和QRadioButton(单选框)都是选项按钮.这是因为它们都可以在开(选 ...

  2. Think Python - Chapter 16 - Classes and functions

    16.1 TimeAs another example of a user-defined type, we’ll define a class called Time that records th ...

  3. 面向过程部分 Java 和 C++ 的区别

    前言 Java 和 C++ 在面向过程部分区别并不大,但还是有的,本文罗列了这些区别. 在 Java 中: 1. 数据类型的范围和机器无关 2. 加上前缀 0b 可以表示二进制数,如 0b1001 就 ...

  4. (实用篇)php无限遍历目录

    使用的函数有: isset()判断某个变量是否定义 chdir() 将当前目录改变为指定的目录. opendir() 打开目录. readdir()读取目录. getcwd().获取当前目录. 还用到 ...

  5. ResponsiveSlides.js最轻量级的幻灯片插件

    摘要:ResponsiveSlides.js是一个展示同一容器内图片的轻量级响应式jQuery幻灯片插件它支持包括IE6在内的几乎所有的浏览器,在IE6中还支持最大宽度属性,但在其它浏览器中并不原生支 ...

  6. c#部分--- 一维数组放到集合中,在从集合中提取输出

    输入班级人数,统计人名,性别,年龄: 建立一维数组,并放到集合中: //Console.Write("请输入班级人数:"); //int a = int.Parse(Console ...

  7. .equal与==的区别

    ==比较的是对象的地址,也就是是否是同一个对象: equal比较的是对象的值. Integer r1 = new Integer(900);//定义r1整型对象Integer r2 = new Int ...

  8. 求10000以内n的阶乘

    总时间限制:  5000ms 内存限制:  655360kB 描述 求10000以内n的阶乘. 输入 只有一行输入,整数n(0<=n<=10000). 输出 一行,即n!的值. 样例输入 ...

  9. 2-1-1 GDI

    主要内容:介绍Windows图形设备接口(GDI)及相关概念 1.Windows图形设备接口(GDI) <1>Windows图形设备接口(GDI),是为与设备无关的图形设计的.  所谓设备 ...

  10. poj1611 带权并查集

    题意:病毒蔓延,现在有 n 个人,其中 0 号被认为可能感染,然后给出多个社交圈,如果某个社交圈里有人被认为可能被感染,那么所有这个社交圈里的人都被认为可能被感染,现在问有多少人可能被感染. 带权并查 ...