2178: 圆的面积并

Time Limit: 20 Sec  Memory Limit: 259 MB
Submit: 1740  Solved: 450
[Submit][Status][Discuss]

Description

给出N个圆,求其面积并

Input

先给一个数字N ,N< = 1000 接下来是N行是圆的圆心,半径,其绝对值均为小于1000的整数

Output

面积并,保留三位小数

太可怕了!!!!!!

直接上辛普森积分 函数值就是x=..线上的区间并

区间并直接排序扫描就可以了

Xcode太愚蠢了样例那么大貌似把控制台崩掉了

不停的T啊....最后发现是辛普森积分写丑了......

结果我写的可能还是太丑了,超过10s.....那些快的都没用辛普森积分吧

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N=,INF=1e9;
  9. const double eps=1e-;
  10. inline int sgn(double x){
  11. if(abs(x)<eps) return ;
  12. else return x<?-:;
  13. }
  14. inline int read(){
  15. char c=getchar();int x=,f=;
  16. while(c<''||c>''){if(c=='-')f=-; c=getchar();}
  17. while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
  18. return x*f;
  19. }
  20. int n;
  21. struct Interval{
  22. double l,r;
  23. bool operator <(const Interval &a) const{
  24. return l==a.l?r<a.r:l<a.l;
  25. }
  26. Interval(double a=,double b=):l(a),r(b){}
  27. }a[N],b[N];
  28.  
  29. struct Circle{
  30. int x,y,r;
  31. Circle(){}
  32. Circle(int x,int y,int r):x(x),y(y),r(r){}
  33. Interval f(double p){
  34. double dx=x-p,t=sqrt(r*r-dx*dx);
  35. return Interval(y-t,y+t);
  36. }
  37. }C[N];
  38. double Dis(Circle a,Circle b){
  39. return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
  40. }
  41. bool del[N];
  42. void iniCircle(){
  43. for(int i=;i<=n;i++) if(!del[i])
  44. for(int j=i+;j<=n;j++) if(!del[j])
  45. if(Dis(C[i],C[j])<=abs(C[i].r-C[j].r)){
  46. if(C[i].r>C[j].r) del[j]=;
  47. else del[i]=;
  48. }
  49. int p=;
  50. for(int i=;i<=n;i++) if(!del[i]) C[++p]=C[i];
  51. n=p;
  52. }
  53. inline double F(double x){
  54. int m=;
  55. for(int i=;i<=n;i++)
  56. if(C[i].x-C[i].r<=x&&x<=C[i].x+C[i].r) a[++m]=C[i].f(x);
  57. sort(a+,a++m);
  58. double last=-INF,re=;
  59. for(int i=;i<=m;i++){
  60. if(a[i].l>last) re+=a[i].r-a[i].l,last=a[i].r;
  61. else if(a[i].r>last) re+=a[i].r-last,last=a[i].r;
  62. }
  63. return re;
  64. }
  65.  
  66. inline double cal(double l,double r){
  67. return (F(l)+F(r)+*F((l+r)/))*(r-l)/;
  68. }
  69. inline double cal(double l,double r,double fl,double fr,double fm){
  70. return (fl+fr+*fm)*(r-l)/;
  71. }
  72. double Simpson(double l,double r,double now,double fl,double fr,double fm){
  73. double mid=(l+r)/,flm=F((l+mid)/),frm=F((mid+r)/);
  74. double p=cal(l,mid,fl,fm,flm),q=cal(mid,r,fm,fr,frm);
  75. if(sgn(now-p-q)==) return now;
  76. else return Simpson(l,mid,p,fl,fm,flm)+Simpson(mid,r,q,fm,fr,frm);
  77. }
  78.  
  79. double lb=INF,rb=-INF;
  80. int main(int argc, const char * argv[]) {
  81. n=read();
  82. for(int i=;i<=n;i++){//printf("i %d\n",i);
  83. C[i].x=read();C[i].y=read();C[i].r=read();
  84. lb=min(lb,(double)C[i].x-C[i].r);
  85. rb=max(rb,(double)C[i].x+C[i].r);
  86. }
  87. iniCircle();
  88. //printf("%d\n",n);
  89. double fl=F(lb),fr=F(rb),fm=F((lb+rb)/);
  90. printf("%.3lf",Simpson(lb,rb,cal(lb,rb,fl,fr,fm),fl,fr,fm));
  91. return ;
  92. }

BZOJ 2178: 圆的面积并 [辛普森积分 区间并]的更多相关文章

  1. bzoj 2178 圆的面积并 —— 辛普森积分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178 先看到这篇博客:https://www.cnblogs.com/heisenberg- ...

  2. bzoj 2178 圆的面积并——辛普森积分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178 把包含的圆去掉.横坐标不相交的一段一段圆分开算.算辛普森的时候预处理 f( ) ,比如 ...

  3. BZOJ 2178: 圆的面积并 (辛普森积分)

    code #include <set> #include <cmath> #include <cstdio> #include <cstring> #i ...

  4. BZOJ 2178 圆的面积并 ——Simpson积分

    [题目分析] 史上最良心样例,史上最难调样例. Simpson积分硬上. 听说用long double 精度1e-10才能过. 但是double+1e-6居然过了. [代码] #include < ...

  5. [BZOJ 2178] 圆的面积并 【Simpson积分】

    题目链接:BZOJ - 2178 题目分析 用Simpson积分,将圆按照 x 坐标分成连续的一些段,分别用 Simpson 求. 注意:1)Eps要设成 1e-13  2)要去掉被其他圆包含的圆. ...

  6. BZOJ 1845: [Cqoi2005] 三角形面积并 (辛普森积分)

    大力辛普森积分 精度什么的搞了我好久- 学到了Simpson的一个trick 深度开11,eps开1e-4.跑的比有些扫描线还快- CODE #include <bits/stdc++.h> ...

  7. bzoj 2178 圆的面积并【simpson积分】

    直接套simpson,f可以直接把圆排序后扫一遍所有圆,这样维护一个区间就可以避免空段. 然而一定要去掉被其他圆完全覆盖的圆,否则会TLE #include<iostream> #incl ...

  8. 【BZOJ】2178: 圆的面积并

    http://www.lydsy.com/JudgeOnline/problem.php?id=2178 题意:给出n<=1000个圆,求这些圆的面积并 #include <cstdio& ...

  9. BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1070  Solved: 596[Submit][Status] ...

随机推荐

  1. java构建学生管理系统(一)

    用java搭建学生管理系统,重要还是对数据库的操作,诸如增删改查等. 1.基本的功能: 老师完成对学生信息的查看和修改,完成对班级的信息的概览. 学生可以看自己的成绩和对自己信息的修改. 学生和老师有 ...

  2. Tree Recovery(由先、中序列构建二叉树)

    题目来源: http://poj.org/problem?id=2255 题目描述: Description Little Valentine liked playing with binary tr ...

  3. HAUTOJ 1283 YK的书架

    题目描述     YK新买了2n+1本相同的书,准备放在家里的3层书架上(每一层放书的数量>=0且<=n).不过YK摆放他的书有些特殊的要求,即任意两层摆放的书的数目之和,严格大于另一层的 ...

  4. 织梦dede列表调用图集的第一张图片大图原图地址(非缩略图)

    dede(55) 我们在使用dede图片集的时候经常会碰到列表页或者内容页要调用一张图片而并非缩略图,那么碰到这样的问题怎么办呢?今天就给大家分享一个解决办法: 步骤一: 修改include/exte ...

  5. jquery ui-----弹出窗口 dialog

    jquery ui 提供了强大的dialog功能,基本能满足开发的功能. 先上一个简单的例子: [代码] <script> $(function() {   $( "#dialo ...

  6. nodejs+websocket实时聊天系统

    介绍下websocket: webSocket协议本质上是一个基于tcp的协议; 建立一个websocket连接,大体的过程: 1.客户端浏览器首先向服务器发起一个http请求,这个请求和平常的请求有 ...

  7. SuperSocket基础一

    SuperSocket基础(一)——————基本概念 项目中之前一直使用TCP socket服务框架,但是不利于扩展.最近刚接触到开源的superSocket感觉很不错,特记录一下.官方开源地址:ht ...

  8. 如何将阿里云mysql RDS备份文件恢复到自建数据库

    参考地址:https://help.aliyun.com/knowledge_detail/41817.html PS:目前恢复只支持 Linux 下进行.Linux下恢复的数据文件,无论 Windo ...

  9. mybatis配置多个数据源事务(Transaction)处理

    当mybatis配置文件中只有一个数据源的时候,按照正常的事务注解形式@Transaction是没有问题的,但是当配置文件中有多个数据源的时候发现事务不起作用了,怎么解决这个问题呢?看下面的案例:

  10. 在nagios中监控windows主机系统地址的状态

    原来的[root@nhserver2_5 objects]# cd /usr/local/nagios/etc/objects[root@nhserver2_5 objects]# vim comma ...