因为本题保证两圆之间只有相包含或相离(不用担心两圆重合 因为我没有RE) 所以每个圆之间的相对位置是确定的  也就是可以按极角排序的, 所以可以按横坐标排序后 扫描同时用treap维护加圆删圆(即遇到圆的左边界加圆 遇到又边界删圆   treap中的节点是某个圆的上半部分 或某个圆的下半部分)

具体见其他人的博客   我只想说 我颓废两天、要来的数据全A交上去还是RE  的原因是   windows的rand是32767内的 而BZOJ是Linux也就是说 int x=rand()*rand()=RE;  好的GG、WP&HF   *&%……#&*%……&@#*    恩 转C没转完整的我 的悲剧

贴代码吧 。。

 #include <bits/stdc++.h>
#define LL long long
#define eps 0.000000001
#define N 400005
using namespace std;
struct blu{int l,r,s,w,h;}a[N];
struct bla{int x,d;}c[N];
int rt,n; LL ans,x,z,r[N],u[N],v[N];
bool cm(bla a,bla b){return a.x<b.x||a.x==b.x&&a.d<b.d;}
void up(int o){a[o].s=a[a[o].l].s+a[a[o].r].s+a[o].w;}
void ll(int &o){
int k=a[o].r; a[o].r=a[k].l; a[k].l=o; up(o); up(k); o=k;
}
void rr(int &o){
int k=a[o].l; a[o].l=a[k].r; a[k].r=o; up(o); up(k); o=k;
}
void add(int &o,int t){
if (!o){a[o=t].s=a[o].w; return;}
long double k=sqrt(r[o]*r[o]-(u[o]-x)*(u[o]-x));
k=o>n?v[o]+k:v[o]-k;
if (z<k-eps) add(a[o].l,t); else add(a[o].r,t);
if (a[a[o].l].h>a[o].h) rr(o); else
if (a[a[o].r].h>a[o].h) ll(o); else up(o);
}
void del(int &o,int t){
if (o==t){
if (!a[o].l&&!a[o].r) {o=;return;}
if (a[a[o].l].h>a[a[o].r].h){
rr(o); del(a[o].r,t);
}else{
ll(o); del(a[o].l,t);
}
up(o); return;
}
long double k=sqrt(r[o]*r[o]-(u[o]-x)*(u[o]-x));
k=o>n?v[o]+k:v[o]-k;
if (z<k-eps||abs(z-k)<=eps&&t<=n) del(a[o].l,t); else del(a[o].r,t);
up(o);
}
int qiu(int o){
if (!o) return ;
long double k=sqrt(r[o]*r[o]-(u[o]-x)*(u[o]-x));
k=o>n?v[o]+k:v[o]-k;
if (z<k-eps) return qiu(a[o].l);
return qiu(a[o].r)+a[o].w+a[a[o].l].s;
}
int main(){
srand(); scanf("%d",&n);
for (int i=;i<=n;++i) {
scanf("%lld%lld%lld",&u[i],&v[i],&r[i]);
u[i+n]=u[i]; v[i+n]=v[i]; r[i+n]=r[i];
c[i].d=i; c[i].x=u[i]-r[i];
c[i+n].d=-i; c[i+n].x=u[i]+r[i];
}
sort(c+,c+n+n+,cm);
for (int i=;i<=n;++i) a[i].w=,a[i+n].w=-;
for (int i=;i<=n+n;++i) a[i].h=rand()+; //←就是这 我写了rand()*rand()
for (int i=;i<=n+n;++i)
if (c[i].d>) {
x=c[i].x; z=v[c[i].d];
ans+=r[c[i].d]*r[c[i].d]*(qiu(rt)&?-:);
add(rt,c[i].d); add(rt,c[i].d+n);
}else{
x=c[i].x; z=v[-c[i].d];
del(rt,-c[i].d); del(rt,-c[i].d+n);
}
printf("%lld",ans);
return ;
}

Saber

BZOJ4561: [JLoi2016]圆的异或并 计算几何+treap的更多相关文章

  1. BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*

    BZOJ4561 JLoi2016 圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区 ...

  2. bzoj4561: [JLoi2016]圆的异或并 圆的扫描线

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4561 题目: 4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec ...

  3. bzoj4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  4. BZOJ4561 JLOI2016圆的异或并(扫描线+平衡树)

    考虑一条扫描线从左到右扫过这些圆.观察某一时刻直线与这些圆的交点,可以发现构成一个类似括号序列的东西,括号的包含关系与圆的包含关系是相同的.并且当扫描线逐渐移动时,括号间的相对顺序不变.于是考虑用se ...

  5. [BZOJ4561][JLOI2016]圆的异或并(扫描线)

    考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变. 将每个圆拆成两边,左端加右端删.每次加圆时考虑它外面最内层的括号属于谁.用se ...

  6. 【BZOJ4561】[JLoi2016]圆的异或并 扫描线

    [BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一 ...

  7. 【BZOJ-4561】圆的异或并 set + 扫描线

    4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 254  Solved: 118[Submit][Statu ...

  8. bzoj 4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  9. BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线

    扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...

随机推荐

  1. [luoguP3178] [HAOI2015]树上操作(dfs序 + 线段树 || 树链剖分)

    传送门 树链剖分固然可以搞. 但还有另一种做法,可以看出,增加一个节点的权值会对以它为根的整棵子树都有影响,相当于给整棵子树增加一个值. 而给以某一节点 x 为根的子树增加一个权值也会影响当前子树,节 ...

  2. 洛谷P1771 方程的解_NOI导刊2010提高(01)

    题目描述 佳佳碰到了一个难题,请你来帮忙解决. 对于不定方程a1+a2+…+ak-1+ak=g(x),其中k≥2且k∈N,x是正整数,g(x)=x^x mod 1000(即x^x除以1000的余数), ...

  3. mybatis查询返回null解决方案

    mybatis查询返回null解决方案: 问题:查询出的列与javabean中的字段名不一致. 解决方案: 1.将javabean中的字段改为和查询出的列名一致: 2.将sql加入as改变列名,和ja ...

  4. Codeforces936B. Sleepy Game

    还好这场没打 MD什么破题 n<=100000,m<=200000的图问从s点出发能否走奇数条边到一个没有出度的点. 直观的想法:做一个bfs,$f(i,0/1)$表示从$s$出发到$i$ ...

  5. linux命令1——基础

    Rm 删除命令 Rm [选项][文件] 删除一个文件或者目录 选项:r 递归的删除文件夹及其子文件,f 忽略不存在的文件(不提示) (2)rm删除目录下所有文件,但不删除目录 >>rm - ...

  6. 找了两个小时的错误,net.sf.json.JSONException: JSON keys cannot be null.

    因为数据库里面一条记录插入的是NULL,所以导致报了net.sf.json.JSONException: JSON keys cannot be null,找了半天都找不出来问题所在,其他人又都可以启 ...

  7. POJ 1144 割点

    题意 :求割点的数量 #include<iostream> #include<stdio.h> #include<vector> #include<strin ...

  8. HDU 6397 组合数学+容斥 母函数

    Character Encoding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth ...

  9. Tomcat可以实现Session共享方案

    说明:原来Tomcat也是可以实现Session共享的,这样大大减少的硬编码的实现,并且前面用Nginx分流时不用考虑Session的问题,因为是Web容器提供了Session共享的支持. 1.在每个 ...

  10. css实现文字渐变

    css文件渐变虽然兼容性比较差,但是用在移动端和chrome中还是没有问题的. 实现文件渐变的方法有两种 1. 使用 background 的属性 2. 使用 mask 属性 方式一. <!DO ...