洛谷P3268 [JLOI2016]圆的异或并(扫描线)
扫描线还不是很熟啊……不管是从想的方面还是代码实现的方面……
关于这题,考虑一条平行于\(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]圆的异或并(扫描线)的更多相关文章
- 【BZOJ4561】[JLoi2016]圆的异或并 扫描线
[BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一 ...
- BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线
扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...
- [BZOJ4561][JLOI2016]圆的异或并(扫描线)
考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变. 将每个圆拆成两边,左端加右端删.每次加圆时考虑它外面最内层的括号属于谁.用se ...
- BZOJ 4561: [JLoi2016]圆的异或并 扫描线 + set
看题解看了半天...... Code: #include<bits/stdc++.h> #define maxn 200010 #define ll long long using nam ...
- bzoj4561: [JLoi2016]圆的异或并 圆的扫描线
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4561 题目: 4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec ...
- BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*
BZOJ4561 JLoi2016 圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区 ...
- 洛谷 P4592: bzoj 5338: [TJOI2018]异或
题目传送门:洛谷P4592. 题意简述: 题面说的很清楚了. 题解: 发现没有修改很快乐.再看异或最大值操作,很容易想到可持久化 01trie. 这里要把 01trie 搬到树上,有点难受. 树剖太捞 ...
- bzoj4561: [JLoi2016]圆的异或并
Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
- bzoj 4561: [JLoi2016]圆的异或并
Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
随机推荐
- 学代码第十七天,JAVA继承
JANA面向对象的三大特性:封装,继承,多态. 今天学了继承,继承,通俗点说就是子类可以用父类的代码,或重写父类的方法.构造方法.属性 例如我这里要调用父类的方法: 下边有两个测试类,自己分别试一下, ...
- oracle学习笔记(四) DQL数据查询语言和TCL 事务控制语言
DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...
- 【spring实战第五版遇到的坑】4.2.3中LDAP内嵌服务器不启动的问题
按照4.2.3中的指导一步一步的去做,在登录界面进行登录时,报错了,报错信息是LDAP服务器连接不上. 后来查了一些资源发现还需要加入一些其他的依赖,如下: <dependency> &l ...
- 阿里云小程序云应用环境DIY,延长3倍免费期
阿里云清明节前刚刚推出了小程序云应用扶持计划一期活动 (活动链接见文章底部).假期研究了下以后,发觉不太给力.基本上就是给了2个月的免费测试环境,和平均2个月的基础版生产环境.而如果选用标准版生产环境 ...
- cesium 之地图显示坐标、比例尺、海拔高度效果篇(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- <3>Centos系统完整安装python流程
一.环境 系统:Centos7 Python:3.6.5 自带pip.setuptools 二.命令 介绍:因为yum是依赖于python2,所以千万别删除自带的python2,下面的方法就是py2 ...
- 你不可不知的Java引用类型之——Reference源码解析
定义 Reference是所有引用类型的父类,定义了引用的公共行为和操作. reference指代引用对象本身,referent指代reference引用的对象,下文介绍会以reference,ref ...
- ASP.NET没有魔法——目录(完结)
ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序 ASP.NET没有魔法——为什么使用ASP.NET ASP.NET没有魔法——第一个ASP.NET应用<MyBlog&g ...
- 自学MongoDB(1)
MongoDB是nosql(非关系型数据库)中的一种,面向文档的数据库,介于传统的结构化数据库(关系型数据库)与非关系型数据库(文件储存)之间的一种,具有数据结构非常松散和非常灵活的特点;常用于存储分 ...
- 一个简易的kmp教学并给出java实现
简单介绍一下问题 给定source字符串,找出target字符串出现的首位 例如 source 为“abddabddabc” target 为 “abddabc” 从第一位开始比较 |a b d ...