洛谷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个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
随机推荐
- .NET Core: 在.NET Core中进行单元测试
单元测试能够帮助开发人员确保所开发的模块.类以及类中的方法等的正确性,在项目开发过程中,及时进行单元测试能够避免不必要的BUG以及提高测试效率. 在本文中,我们会分别来学习如何使用MSTest.xUn ...
- 数据结构——Java实现链栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...
- 【学习笔记】分布式Tensorflow
目录 分布式原理 单机多卡 多机多卡(分布式) 分布式的架构 节点之间的关系 分布式的模式 数据并行 同步更新和异步更新 分布式API 分布式案例 Tensorflow的一个特色就是分布式计算.分布式 ...
- Web前端新学
本人大学时学的是网络工程,那时候只是大概学了一点HTML和CSS.毕业后没有找IT方面的工作,所以对专业知识忘得差不多了.然由于生活现状,终是决心重新好好学习IT,刚入学的一周学习了C#语言的一些知识 ...
- 基于python的种子搜索网站-开发过程
本讲会对种子搜索网站的开发过程进行详细的讲解. 源码地址:https://github.com/geeeeeeeek/bt 项目开发过程 项目简介 该项目是基于python的web类库django开发 ...
- TSC条码打印机C#例程(tsclib.dll调用) 【转】
//---- program.cs using System;using System.Collections.Generic;using System.Windows.Forms; using S ...
- C#-反射reflection
目录 简介 引入 1.新建类库 2. 类库的使用 3.反射 反射实例1 反射实例2 反射实例3 C# shanzm 简介 反射(reflection)是什么? 在<精通C#>中是这么说的& ...
- OSXFUSE file system is not available 解决方法
操作系统版本:10.14 macos mojeva 今天用truecrypt加载加密盘时候提示次错误:用window加载也有错误,不过用windows自带的工具检查修复了错误. 解决办法: 1.访问h ...
- AI 学习路线
[导读] 本文由知名开源平台,AI技术平台以及领域专家:Datawhale,ApacheCN,AI有道和黄海广博士联合整理贡献,内容涵盖AI入门基础知识.数据分析挖掘.机器学习.深度学习.强化学习.前 ...
- js实现搜索记录列表
<div class="sy_div28"> <div class="sy_div23"> <span>搜索历史</s ...