洛谷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个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
随机推荐
- NLog组件
接触.net项目的同志们都清楚,最初在项目中记录日志常用的是log4net日志组件,随着.net框架的不对优化升级,最近新流行的日志框架nlog,下面我就对nlog组件说说自己的认知: 下载 通过Nu ...
- vue-router 用户登陆
有些路由页面需要用户登陆之后才能访问如(用户中心),如果用户没有登陆就访问这些页面的话就应该转换到登陆页面,登陆成功之后在进入该页面. 需要用到的知识点有:H5中的会话存储(sessionStorag ...
- API测试工具SoapUI & Postman对比分析
本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 最近公司要引入API测试工具,经过调查和了解,最终决定在SoapUI ...
- 源码浅谈(二):java中的 Integer.parseInt(String str)方法
这个方法是将字符串转换为整型 一.parseInt方法 ,可以看到默认又调用了parseInt(s,10) , 第二个参数为基数,默认10 ,当然也可以自己设置 public static int ...
- Android为TV端助力 listview与recyclerview上下联动
首先是主布局fragment里面的xml文件 <?xml version="1.0" encoding="utf-8"?><RelativeL ...
- 转int啥啥啥的
1.String转int类型的话.需要用Double.valueof("这写String类型的数据").intValue(); 2.保留小数点: float scale = (fl ...
- 解决在圆角手机(如小米8)上自定义Dialog无法全屏的问题
在小米8等一系列圆角的手机上测试项目时,发现我的自定义dialog无法全屏了,这时我的dialog全屏的解决方案还是和网上大部分人是一样的 Window window = getWindow(); i ...
- StackExchange.Redis中文使用文档
StackExchange.Redis中文使用文档 Intro 最近想深入学习一些 Redis 相关的东西.于是看了看官方的项目 StackExchange,发现里面有一份文档,于是打算翻译成中文,方 ...
- windows下vagrant的安装使用
vagrant是简便虚拟机操作的一个软件,而使用虚拟机有几个好处: 1.为了开发环境与生产环境一致(很多开发环境为windows而生产环境为linux),不至于出现在开发环境正常而移步到正式生产环境时 ...
- ASP.Net Core开发(踩坑)指南
ASP.NET与ASP.NET Core很类似,但它们之间存在一些细微区别以及ASP.NET Core中新增特性的使用方法,在此之前也写过一篇简单的对比文章ASP.NET MVC应用迁移到ASP.NE ...