扫描线还不是很熟啊……不管是从想的方面还是代码实现的方面……


关于这题,考虑一条平行于\(y\)轴的扫描线从左到右扫描每一个圆,因为只有相离和内含两种关系,只用在切线处扫描即可

我们设上半圆为1,下半圆为-1,当前遍历到的圆为\(i\)。然后把每个圆弧按照和这条扫描线的交点的纵坐标从小到大排序,然后找每个下半圆的前驱,设这个前驱对应的圆为\(j\)。

如果这个前驱为上半圆,即这两个圆相离,状态相同

如果这个前驱为下半圆,即圆\(i\)内含于圆\(j\),状态相反

嘛……不理解的话直接上图好了,紫圆为圆\(i\),紫点为圆\(i\)的前驱,显然紫点对应的是个上半圆,状态相同

维护前驱可以用set维护,扫描到右切线时记得要删除半圆

代码

#include <bits/stdc++.h>
#define N 200010
#define ll long long
#define rep(i,x,y) for(i=(x);i<=(y);++i)
using namespace std;

const double eps=1e-9;
int x[N],y[N],r[N],nx,use[N];

struct point{
    int id,f;
    int X(){ return x[id]-f*r[id]; }
    friend bool operator <(point a,point b){ return (a.X()==b.X())?r[a.id]<r[b.id]:a.X()<b.X(); }
}p[N<<1];
struct pos{
    int id,f;
    double cycY(){
        double tmp=sqrt(1.0*r[id]*r[id]-1.0*(nx-x[id])*(nx-x[id]));
        return 1.0*y[id]+1.0*f*tmp;
    }
    friend bool operator <(pos a,pos b){ return (fabs(a.cycY()-b.cycY())<eps)?a.f<b.f:a.cycY()<b.cycY();  }
};
set<pos>qwq;
set<pos>::iterator it;

int main(){
    int n,i;
    ll ans=0;
    scanf("%d",&n);
    rep(i,1,n){
        scanf("%d%d%d",&x[i],&y[i],&r[i]);
        p[i]=(point){i,1},p[i+n]=(point){i,-1};
    }
    sort(p+1,p+2*n+1);
    rep(i,1,2*n){
        nx=p[i].X();
        if(p[i].f==1){
            it=(qwq.insert((pos){p[i].id,1})).first;
            if(it==qwq.begin()) use[p[i].id]=1;
            else{
                it--;
                if((*it).f==1) use[p[i].id]=use[(*it).id];
                else use[p[i].id]=-use[(*it).id];
            }
            qwq.insert((pos){p[i].id,-1});
        } else{
            qwq.erase((pos){p[i].id,1});
            qwq.erase((pos){p[i].id,-1});
        }
    }
    rep(i,1,n) ans+=1ll*use[i]*r[i]*r[i];
    printf("%lld\n",ans);
}

洛谷P3268 [JLOI2016]圆的异或并(扫描线)的更多相关文章

  1. 【BZOJ4561】[JLoi2016]圆的异或并 扫描线

    [BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一 ...

  2. BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线

    扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...

  3. [BZOJ4561][JLOI2016]圆的异或并(扫描线)

    考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变. 将每个圆拆成两边,左端加右端删.每次加圆时考虑它外面最内层的括号属于谁.用se ...

  4. BZOJ 4561: [JLoi2016]圆的异或并 扫描线 + set

    看题解看了半天...... Code: #include<bits/stdc++.h> #define maxn 200010 #define ll long long using nam ...

  5. bzoj4561: [JLoi2016]圆的异或并 圆的扫描线

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4561 题目: 4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec ...

  6. BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*

    BZOJ4561 JLoi2016 圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区 ...

  7. 洛谷 P4592: bzoj 5338: [TJOI2018]异或

    题目传送门:洛谷P4592. 题意简述: 题面说的很清楚了. 题解: 发现没有修改很快乐.再看异或最大值操作,很容易想到可持久化 01trie. 这里要把 01trie 搬到树上,有点难受. 树剖太捞 ...

  8. bzoj4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  9. bzoj 4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

随机推荐

  1. 学代码第十七天,JAVA继承

    JANA面向对象的三大特性:封装,继承,多态. 今天学了继承,继承,通俗点说就是子类可以用父类的代码,或重写父类的方法.构造方法.属性 例如我这里要调用父类的方法: 下边有两个测试类,自己分别试一下, ...

  2. oracle学习笔记(四) DQL数据查询语言和TCL 事务控制语言

    DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...

  3. 【spring实战第五版遇到的坑】4.2.3中LDAP内嵌服务器不启动的问题

    按照4.2.3中的指导一步一步的去做,在登录界面进行登录时,报错了,报错信息是LDAP服务器连接不上. 后来查了一些资源发现还需要加入一些其他的依赖,如下: <dependency> &l ...

  4. 阿里云小程序云应用环境DIY,延长3倍免费期

    阿里云清明节前刚刚推出了小程序云应用扶持计划一期活动 (活动链接见文章底部).假期研究了下以后,发觉不太给力.基本上就是给了2个月的免费测试环境,和平均2个月的基础版生产环境.而如果选用标准版生产环境 ...

  5. cesium 之地图显示坐标、比例尺、海拔高度效果篇(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  6. <3>Centos系统完整安装python流程

    一.环境 系统:Centos7 Python:3.6.5  自带pip.setuptools 二.命令 介绍:因为yum是依赖于python2,所以千万别删除自带的python2,下面的方法就是py2 ...

  7. 你不可不知的Java引用类型之——Reference源码解析

    定义 Reference是所有引用类型的父类,定义了引用的公共行为和操作. reference指代引用对象本身,referent指代reference引用的对象,下文介绍会以reference,ref ...

  8. ASP.NET没有魔法——目录(完结)

    ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序 ASP.NET没有魔法——为什么使用ASP.NET ASP.NET没有魔法——第一个ASP.NET应用<MyBlog&g ...

  9. 自学MongoDB(1)

    MongoDB是nosql(非关系型数据库)中的一种,面向文档的数据库,介于传统的结构化数据库(关系型数据库)与非关系型数据库(文件储存)之间的一种,具有数据结构非常松散和非常灵活的特点;常用于存储分 ...

  10. 一个简易的kmp教学并给出java实现

    简单介绍一下问题 给定source字符串,找出target字符串出现的首位 例如 source   为“abddabddabc” target 为 “abddabc” 从第一位开始比较 |a b d ...