题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178

把包含的圆去掉。横坐标不相交的一段一段圆分开算。算辛普森的时候预处理 f( ) ,比如把自己的 f( l ) 和 f( r ) 从上一层传进来之类的,能少算很多次。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
using namespace std;
const int N=; const db eps=1e-;
db Fabs(db x){return x<?-x:x;}
db Sqr(db x){return x*x;}
int nMx(int a,int b){return a>b?a:b;}
db dMx(db a,db b){return a>b?a:b;}
int n,xl[N],xr[N],st,ed; db ans;
struct Cir{
int r,x,y;
bool operator< (const Cir &b)const
{return r>b.r;}
}t[N];
struct Node{
db l,r;
Node(db a=,db b=):l(a),r(b) {}
bool operator< (const Node &b)const
{return l<b.l;}
}a[N];
bool cmp(Cir u,Cir v){return u.x-u.r<v.x-v.r;}
db f(db p)
{
int cnt=; db ret=;
for(int i=st;i<=ed;i++)
if(xr[i]>p&&xl[i]<p)
{
db k=sqrt(t[i].r-Sqr(p-t[i].x));
a[++cnt]=Node(t[i].y-k,t[i].y+k);
}
sort(a+,a+cnt+);
for(int i=,j=;i<=cnt;i=j)
{
db L=a[i].l,R=a[i].r;
for(j=i+;j<=cnt&&a[j].l<=R;j++)R=dMx(R,a[j].r);
ret+=R-L;
}
return ret;
}
db cal(db fl,db fm,db fr,db d){return (fl+*fm+fr)*d/;}
db simp(db l,db mid,db r,db fl,db fm,db fr,db ret)
{
db m1=(l+mid)*0.5,m2=(mid+r)*0.5,fm1=f(m1),fm2=f(m2);
db vl=cal(fl,fm1,fm,mid-l),vr=cal(fm,fm2,fr,r-mid);
if(Fabs(vl+vr-ret)<=eps)return vl+vr;
return simp(l,m1,mid,fl,fm1,fm,vl)+simp(mid,m2,r,fm,fm2,fr,vr);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].r);
sort(t+,t+n+);
for(int i=;i<=n;i++)
for(int j=;j<i;j++)
{
db d=sqrt(Sqr(t[i].y-t[j].y)+Sqr(t[i].x-t[j].x));
if(d+t[i].r<=t[j].r)
{t[i--]=t[n--];break;}
}
sort(t+,t+n+,cmp);
for(int i=;i<=n;i++)
xl[i]=t[i].x-t[i].r,xr[i]=t[i].x+t[i].r,t[i].r*=t[i].r;
int L,R;db fl,fr,mid,fm;
for(int i=,j;i<=n;i=j)//j not j-1
{
L=xl[i];R=xr[i];
for(j=i+;j<=n&&xl[j]<=R;j++)R=nMx(R,xr[j]);
st=i;ed=j-;
fl=f(L);fr=f(R);mid=(db)(L+R)*0.5;fm=f(mid);
ans+=simp(L,mid,R,fl,fm,fr,cal(fl,fm,fr,R-L));
}
printf("%.3f\n",ans);
return ;
}

bzoj 2178 圆的面积并——辛普森积分的更多相关文章

  1. BZOJ 2178: 圆的面积并 [辛普森积分 区间并]

    2178: 圆的面积并 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1740  Solved: 450[Submit][Status][Discus ...

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

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

  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. 1-13 RHEL7-硬盘介绍和磁盘管理

    熟悉Linux平台下的存储介质,LVM逻辑卷.RAID 磁盘陈列等 大纲: 1-1  硬盘的分类及使用fdisk分区工具       1-1-1 认识硬盘的分类和特性.SCSI.IDE.SAS.SAT ...

  2. mysql中一个字段根据另一字段的值分割为不同列

    1.数据结构如下: vehicleId mileage_type mileage 11AM6897           0 120 11AM6897           1 60 13AY9180 0 ...

  3. ZOJ 2599 Graduated Lexicographical Ordering ★(数位DP)

    题意 定义两个数的比较方法,各位数字之和大的数大,如果数字和相等则按字典序比较两个数的大小.输入n,k,求:1.数字k的排名:2.排名为k的数. 思路 算是一类经典的统计问题的拓展吧~ 先来看第一问. ...

  4. 这可能是最详细的 iOS 学习入门指南(含书目/文档/学习资料)

    1 零基础小白如何进行 iOS 系统学习 首先,学习目标要明确: 其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走: 再次,学技术最重要的一点就是多动手. ...

  5. Python中实现switchcase

    # 第一种方式使用python中的字典# author:wanstack def first_func(): print('first_func') def second_func(): print( ...

  6. 不使用构造方法创建Java对象: objenesis的基本使用方法

    转载:http://blog.csdn.net/codershamo/article/details/52015206 objenesis简介: objenesis是一个小型Java类库用来实例化一个 ...

  7. ArcGIS中标注转注记方法比较

    [数据处理]ArcGIS中标注转注记方法比较 (2013-02-22 08:42:15) 转载▼ 标签: arcgis 标注 注记 label annotation 分类: 数据处理 1.概述 由于切 ...

  8. Django中通过定时任务触发页面静态化的方式

    安装 pip install django-crontab 添加应用 INSTALLED_APPS = [ ... 'django_crontab', # 定时任务 ... ] 设置任务的定时时间 在 ...

  9. python 中 property 属性的讲解及应用

    Python中property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回 property属性的有两种方式: 1. 装饰器 即:在方法上应用装饰器 2. 类属性 即 ...

  10. Linux:centOS LAMP搭建之软件包下载地址

    MySQL5.1 wget mysql-5.1.73-linux-i686-glibc23.tar.gz #二进制包 MySQL5.6 wget http://mirrors.sohu.com/mys ...