洛谷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个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
随机推荐
- jQuery(五)、筛选
1 过滤 1.eq(index | -index) 获取第N个元素,index为元素索引,-index值基于最后一个元素的位置(从 1 开始) 2.first() 获取第一个元素 3.last() 获 ...
- 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(2)!
前言- 明确了项目目录的结构,但是结构什么的也太"抽象"了. 本篇开始上代码! 模型的绘制- 前几天的学习中,live2d的绘制有了一些了解了,在Android端使用OpenGL ...
- Java:配置环境(Mac)——Eclipse;修改JDK版本后,Eclipse打不开
1.官网下载 选择一个速度快的镜像 推荐东软这个 2.双击下载的安装包,下一步 其中有一步是选择Eclipse版本,SE选第一个,EE第二个.仔细审题吧. 3.配置JDK 应用.关闭 4.测试:写个H ...
- js实现自定义修改网页中表格信息
项目中的打印页面,为提高用户体验,需要增自定修改表格内容的功能,以下是使用示意图(双击td标签部分的内容,可自定义修改): 以下是js插件源码,存为edit.js文件: var tbl, tbt; v ...
- MyDAL - .QueryListAsync() 使用
索引: 目录索引 一.API 列表 .QueryListAsync() .QueryListAsync<M>() 如: .QueryListAsync<AgentInventoryR ...
- spark2.4 分布式安装
一.Spark2.0的新特性Spark让我们引以为豪的一点就是所创建的API简单.直观.便于使用,Spark 2.0延续了这一传统,并在两个方面凸显了优势: 1.标准的SQL支持: 2.数据框(Dat ...
- mybaties xml 的头部
config.xml的头部: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE config ...
- A customized combobox with JQuery
要求实现一个轻量级的在客户端筛选的combobox,支持大数据量(超过1000个items),能快速检索内容,并支持数据的设置和活动等基本操作.在这之前尝试过使用Jquery UI的Autocompl ...
- RIPng(第三组)
一.实验拓扑 2.地址规划 3.实验配置 1)配置各个路由器的端口地址,PC端地址采用自动配置 如本处的PC0,自动获取IPV6地址 2)配置RIP a.现在路由器开启RIP:ipv6 router ...
- 来自学长&师兄们的应届校招经验
PART1 记得三月的第一个星期五吧,小操场打球,偶遇一位研三师兄,就主动跟师兄聊起了校招求职.很高兴,能遇到一位愿意跟你分享他自己求职经验的师兄,师兄也很热情,我们聊了好多.下面,开始 ...