博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ4561][JLOI2016]圆的异或并(扫描线)
阅读量:5061 次
发布时间:2019-06-12

本文共 1107 字,大约阅读时间需要 3 分钟。

考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变。

将每个圆拆成两边,左端加右端删。每次加圆时考虑它外面最内层的括号属于谁。用set维护括号序列,每次从插入的位置往上找,如果第一个找到的是上括弧则说明被它包含,如果是下括弧说明和它并列。这样每个圆的符号就可以确定了。

1 #include
2 #include
3 #include
4 #include
5 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 6 typedef long long ll; 7 using namespace std; 8 9 const int N=400010;10 int n,tmp,f[N];11 ll ans,x[N],y[N],r[N];12 13 struct P{ int x,f,id; }q[N];14 double gety(int id,int p,int k)15 { return y[id]+k*sqrt(r[id]*r[id]-(x[id]-p)*(x[id]-p)); }16 17 struct D{ int id,k; };18 bool operator <(const D &a,const D &b){19 return (a.id==b.id) ? a.k
S;23 bool cmp(const P &a,const P &b){ return a.x==b.x ? a.f
::iterator it=S.lower_bound((D){q[i].id,1});38 if (it!=S.end()) f[q[i].id]=((it->k==1)?-1:1)*f[it->id];39 else f[q[i].id]=1;40 S.insert((D){q[i].id,1}); S.insert((D){q[i].id,-1});41 }42 }43 rep(i,1,n) ans+=f[i]*r[i]*r[i];44 printf("%lld\n",ans);45 return 0;46 }

 

转载于:https://www.cnblogs.com/HocRiser/p/10061884.html

你可能感兴趣的文章
Django学习-4-request获取数据
查看>>
python----redis
查看>>
证明:37的500次方减去37的100次方的结果是10的倍数!
查看>>
android 自定义流布局实现
查看>>
rzsz的安装
查看>>
批处理常见疑问
查看>>
枚举数与可枚举类型(笔记)
查看>>
marquee标签使用【转载】
查看>>
3.1 查找文本
查看>>
详细的SQL中datediff用法
查看>>
打造属于你的聊天室(WebSocket)
查看>>
Spring Boot 整合 Shiro-登录认证和权限管理
查看>>
P2668 斗地主
查看>>
Sharepoint学习笔记--资料收集--Sharepoint的内建字段
查看>>
.Net 配置的简陋解决方案
查看>>
Python中的单例模式实现
查看>>
EasyPusher:基于live555的DarwinInjector实现的RTSP直播推送程序
查看>>
运算符中的一些小技巧
查看>>
Apache配置HTTPS的过程小记
查看>>
万维网WWW详解
查看>>