传送门

把圆拆成上下两个圆弧,因为不存在相交关系,圆弧直接的上下关系是不变的。

用set维护这些圆弧,插入的时候upper_bound一下,如果找到的是上圆弧,就是我外面的第一个圆,否则我外面的第一个圆就是这个下圆弧外面的第一个圆。

  1. //Achen
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<vector>
  7. #include<cstdio>
  8. #include<queue>
  9. #include<cmath>
  10. #include<set>
  11. #define For(i,a,b) for(int i=(a);i<=(b);i++)
  12. #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
  13. const int N=;
  14. typedef long long LL;
  15. typedef double db;
  16. using namespace std;
  17. int n,cnt,f[N];
  18. db x[N],y[N],r[N],now;
  19.  
  20. template<typename T>void read(T &x) {
  21. char ch=getchar(); x=; T f=;
  22. while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
  23. if(ch=='-') f=-,ch=getchar();
  24. for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
  25. }
  26.  
  27. struct node {
  28. int id,f;
  29. node(){}
  30. node(int id,int f):id(id),f(f){}
  31. friend bool operator <(const node&A,const node&B) {
  32. return x[A.id]+A.f*r[A.id]<x[B.id]+B.f*r[B.id];
  33. }
  34. }q[N];
  35.  
  36. struct bow {
  37. int id,f;
  38. bow(){}
  39. bow(int id,int f):id(id),f(f){}
  40. };
  41.  
  42. bool operator <(const bow&A,const bow&B) {
  43. db y1=(db)y[A.id]+(db)A.f*sqrt(r[A.id]*r[A.id]-(now-x[A.id])*(now-x[A.id]));
  44. db y2=(db)y[B.id]+(db)B.f*sqrt(r[B.id]*r[B.id]-(now-x[B.id])*(now-x[B.id]));
  45. return y1==y2?A.f<B.f:y1<y2;
  46. }
  47.  
  48. set<bow>s;
  49. #define IT set<bow>::iterator
  50.  
  51. //#define DEBUG
  52. int main() {
  53. #ifdef DEBUG
  54. freopen("4561.in","r",stdin);
  55. freopen("4561.out","w",stdout);
  56. #endif
  57. read(n);
  58. For(i,,n) { read(x[i]); read(y[i]); read(r[i]); q[++cnt]=node(i,-); q[++cnt]=node(i,); }
  59. sort(q+,q+cnt+);
  60. For(i,,cnt) {
  61. now=x[q[i].id]+q[i].f*r[q[i].id];
  62. if(q[i].f==-) {
  63. IT it=s.upper_bound(bow(q[i].id,));
  64. if(it!=s.end()) {
  65. bow tp=*it;
  66. if(tp.f==-) f[q[i].id]=f[tp.id];
  67. else f[q[i].id]=-f[tp.id];
  68. }
  69. else f[q[i].id]=;
  70. s.insert(bow(q[i].id,)); s.insert(bow(q[i].id,-));
  71. }
  72. else s.erase(bow(q[i].id,)),s.erase(bow(q[i].id,-)) ;
  73. }
  74. db ans=;
  75. For(i,,n)
  76. ans+=r[i]*r[i]*f[i];
  77. printf("%lld\n",(LL)ans);
  78. return ;
  79. }
  80. /*
  81. 5
  82. -153 -765 50
  83. -51 -765 50
  84. 0 867 50
  85. 0 969 50
  86. 0 969 47
  87. */

【BZOJ4561】[JLoi2016]圆的异或并的更多相关文章

  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]圆的异或并 计算几何+treap

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

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

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

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

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

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

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

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

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

随机推荐

  1. Ulimit 文件配置

    cat /etc/security/limits.confsudo vim /etc/security/limits.conf * hard nofile 999999 * soft nofile 9 ...

  2. 使用R语言 SDK调取tushare数据

    安装Tushare 打开RStudio,在控制台输入命令: > install.packages('Tushare') Tushare的R包需要依赖httr.tidyverse.forecast ...

  3. HDU 5726 线段树+dp

    题意:给出一个序列,后q次询问,求给定区间gcd及整个序列有多少个序列的gcd和这个值相同 首先线段树维护区间gcd建树,之后预处理出每个gcd有多少个子序列,这时需要dp, dp[i][tmp]表示 ...

  4. 2018湘潭大学程序设计竞赛【H】

    题目链接:https://www.nowcoder.com/acm/contest/105/H 题意:两个操作,一个在[l,r]区间放颜色为c的球,一个统计在[l,r]里有多少不同颜色的球. 题解:哎 ...

  5. 正版STlink的使用注意

    https://blog.csdn.net/xinghuanmeiying/article/details/78026561

  6. Java中哪个JSON库的解析速度是最快的?

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考 了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上 ...

  7. drools语法介绍

    这里没有翻译http://docs.jboss.org/drools/release/6.4.0.Final/drools-docs/html_single/index.html上的内容 而是参考了网 ...

  8. spring MVC 全局的异常处理

    1.使用SimpleMappingExceptionResolver实现异常处理 在Spring的配置文件applicationContext.xml中增加以下内容: <bean class=& ...

  9. Permission denied: user=root, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x

    通过手动安装CDH没权限 [root@slave1 ~]# groupadd supergroup[root@slave1 ~]# hadoop fs -mkdir /tao3^C[root@slav ...

  10. nodejs . module.exports

    //utils.js let a = 100; console.log(module.exports); //能打印出结果为:{} console.log(exports); //能打印出结果为:{} ...