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. 关于string的练习题目

    /*Are they equal*/#include<iostream>#include<string>using namespace std;int n;string dea ...

  2. DIV的圆角表现和TAB切换

    内容大体是从网上找过来的,感觉那位哥们说的对,css还是比较靠谱的,当然有些高玩搞出来的东西本地 没有运行起来. 把自己的应用贴出来同大家分享 <html> <head> &l ...

  3. 准备开始自己搞企业管理软件,从openerp入手

    公司运行了半年多,人还比较少,只用了一些即时通讯工具,还有svn等基本的工具 记账用的是gnucash 其他的管理急需相应的软件,找了很长时间也没有合适的 想了想,还是从开源的openerp odoo ...

  4. 1-3-1 关于API

    主要内容:API函数及其相关内容的介绍.Windows编程相关基础知识介绍 1.API函数的概念 <1>API(Application Programming interface),即应用 ...

  5. Hive不支持非相等的join

    由于 hive 与传统关系型数据库面对的业务场景及底层技术架构都有着很大差异,因此,传统数据库领域的一些技能放到 Hive 中可能已不再适用.关于 hive 的优化与原理.应用的文章,前面也陆陆续续的 ...

  6. HDU-1255 覆盖的面积 (扫描线)

    题目大意:给若干个矩形,统计重叠次数不为0的面积. 题目分析:维护扫描线的长度时,只需要只统计覆盖次数大于1的区间即可.这是个区间更新,不过不能使用懒标记,但是数据规模不大,不用懒惰标记仍可以AC. ...

  7. CUDA学习笔记(二)【转】

    来源:http://luofl1992.is-programmer.com/posts/38847.html 编程语言的特点是要实践,实践多了才有经验.很多东西书本上讲得不慎清楚,不妨自己用代码实现一 ...

  8. sed详解

    1. Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后 ...

  9. C#基础:Lambda表达式

    从委托的角度来看,Lambda表达式与匿名方法没有区别.在[C#基础:匿名方法]一文中,我使用了匿名方法来调用List<T>的FindAll方法.从C# 3.0开始,在使用匿名方法的地方, ...

  10. Android Studio导入Project的方法

    Android Studio到现在已经发展到0.8+的版本了,最近也在试着使用它,原因是多方面的,一个毕竟是未来的趋势,二则是github上越来越多的大牛开源项目都是基于Android Studio的 ...