bzoj4642: 泡泡

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-8,_s=std::sin(0.43415),_c=std::cos(0.43415);
int ans=0;
struct cir{
    ld x,y,r;
}cs[500010];
struct event{
    ld x;
    int id,type;
}es[1000010];
std::pair<int,int>as[1500050];
int ap=0;
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=0;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<<1]=(event){cs[i].x-cs[i].r,i,1};
        es[i<<1^1]=(event){cs[i].x+cs[i].r,i,0};
    }
    n<<=1;
    std::sort(es,es+n);
    for(int i=0;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=1;
    for(int i=1;i<ap;i++)if(as[i]!=as[i-1])++ans;
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-13 00:28:24

bzoj4642: 泡泡的相关文章

BZOJ 1034: [ZJOI2008]泡泡堂BNB( 贪心 )

贪心...用最弱的赢最弱的,用最强的赢最强的,否则用最弱的和最强的比... (贴个官方题解:将双方的选手均按从强到弱排序,然后第一次扫描尽可能用当前剩下的选手中能赢对手当前最强选手中最弱的一个去赢得胜利,若无法做到,则暂时不考虑给对方最强的选手匹配对手.第二遍扫描使用同样策略去获取尽量多的平局.最后剩下的选手任意匹配就能获得最多的分数) -------------------------------------------------------------------- #include<cs

ZJOI2008泡泡堂BNB

1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1305  Solved: 676[Submit][Status] Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定,不得修改.比赛中

iphone开发必知点之--清除和设置桌面提示泡泡计数

当app重新打开或切换到前台时,在app委托applicationWillEnterForeground:方法里实现 清除泡泡计数 - (void)applicationWillEnterForeground:(UIApplication *)application { // clear badage [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; } 在app被激活时,设置泡泡计数 - (void)app

PS基础教程[1]如何制作微信泡泡

PS是很多朋友都很喜欢额一款图像处理软件,我们可以使用PS制作很多的效果,本系列经验教程的起源就来源于知道中这位朋友问的微信泡泡如何使用,下面就来简单的分享一下. 微信泡泡制作方法 有很多的方法可以制作这种聊天的气泡,我们可以直接在网上下载笔刷或是自己动手制作. 先介绍第一种:DIY方法. 1.打开pS软件,新建一个画布,大小什么的就不多说了,直接默认也行,没什么关系. 2.按下M键,选择矩形选框工具,将菜单中的羽化值设置为30左右即可,绘制一个矩形. 3.选择路径面板,点击下面的将选区转化为路

1034: [ZJOI2008]泡泡堂BNB

题目描述: 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定,不得修改.比赛中,双方的一号选手,二号选手--,n号选手捉对厮杀,共进行n场比赛.每胜一场比赛得2分,平一场得1分,输一场不得分.最终将双方的单场得分相加得出总分,总分高的队伍晋级(总分相同抽签决定).作为浙江队的领队,你已经在事先将各省

BZOJ [ZJOI2008]泡泡堂BNB 贪心

[ZJOI2008]泡泡堂BNB Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1034 Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定

[BZOJ 1034] [ZJOI 2008] 泡泡堂BNB

1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 SecMemory Limit: 162 MB Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定,不得修改.比赛中,双方的一号选手,二号选手……,n号选手捉对厮杀,共进行n场比赛.每胜一场比赛得2分,

0421 iPad 泡泡

1. 拖控件 2. 连线 3. 创建tableViewController 4. 实例化pop, 作为成员 5. pop方法 // 箭头朝上,内容就想下,如图: // 下====上 以此类推 Any 会自己决定一个最合适的方向 // so: 一般用Any 1. 点击按钮时, 保存这个数字 2. 再次输入时,过滤,比如输入1就出来先前输入的内容. // 123 1123 12345 参考之前的笔记: 0324 Foundation框架 NSSting ***********************

右下角冒泡泡

using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms; namespace WindowsFormsApplication7 { public partial class Form1 : Form { public Form1() {