原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2178.html

题目传送门 - BZOJ2178

题意

  给出 $n(n\leq 1000)$ 个圆,求面积并。

  所有圆的圆心坐标和半径都是绝对值不大于 1000 的整数。

题解

  自适应辛普森积分模板题。注意先删掉被其他圆包含的圆。

  但是 bzoj 大概是加过数据了,网上大部分直接自适应辛普森的代码都 TLE 了。

  有一种卡常方法效果很好:

  把 x 坐标按照整点划分成 $O(1000)$ 个区间,对于每一个区间,删除不涉及这个区间的所有圆。然后就过了。

代码

#include <bits/stdc++.h>
#define y1 __zzd12323
using namespace std;
const int N=1005;
const double Eps=1e-9,INF=1e9;
double sqr(double x){
return x*x;
}
int n;
struct Circle{
double x,y,r;
}c[N],_c[N];
bool cmpr(Circle a,Circle b){
return a.r>b.r;
}
struct Seg{
double L,R;
}s[N];
bool cmp(Seg a,Seg b){
return a.L<b.L;
}
double F(double x){
int m=0;
for (int i=1;i<=n;i++){
if (fabs(x-c[i].x)>c[i].r-Eps)
continue;
double M=c[i].y,a=sqrt(sqr(c[i].r)-sqr(x-c[i].x));
s[++m].L=M-a,s[m].R=M+a;
}
sort(s+1,s+m+1,cmp);
double res=0.0,mx=-INF;
for (int i=1;i<=m;i++)
if (s[i].L>mx)
res+=s[i].R-s[i].L,mx=s[i].R;
else if (s[i].R>mx)
res+=s[i].R-mx,mx=s[i].R;
return res;
}
double Simpson(double a,double b,double Fa,double Fb,double Fab){
return (b-a)/6*(Fa+Fab*4+Fb);
}
double Asr(double a,double b,double v,double Fa,double Fb,double Fab){
double ab=(a+b)/2;
double LFab=F((a+ab)/2),L=Simpson(a,ab,Fa,Fab,LFab);
double RFab=F((ab+b)/2),R=Simpson(ab,b,Fab,Fb,RFab);
if (fabs(v-L-R)<Eps)
return v;
return Asr(a,ab,L,Fa,Fab,LFab)
+Asr(ab,b,R,Fab,Fb,RFab);
}
int killed[N];
double Dis(double x1,double y1,double x2,double y2){
return sqrt(sqr(x1-x2)+sqr(y1-y2));
}
int main(){
scanf("%d",&n);
double a=INF,b=-INF;
for (int i=1;i<=n;i++){
scanf("%lf%lf%lf",&c[i].x,&c[i].y,&c[i].r);
a=min(a,c[i].x-c[i].r);
b=max(b,c[i].x+c[i].r);
}
sort(c+1,c+n+1,cmpr);
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
if (Dis(c[i].x,c[i].y,c[j].x,c[j].y)+c[j].r<c[i].r+Eps)
killed[j]=1;
int _n=0;
for (int i=1;i<=n;i++)
if (!killed[i])
c[++_n]=c[i];
n=_n;
double ans=0;
for (double x=a;x<b;x++){
for (int i=1;i<=n;i++)
_c[i]=c[i];
int _n=n;
n=0;
for (int i=1;i<=_n;i++)
if (c[i].x-c[i].r<i+1&&c[i].x+c[i].r>i)
c[++n]=_c[i];
n=_n;
for (int i=1;i<=n;i++)
c[i]=_c[i];
double Fa=F(x),Fb=F(x+1),Fab=F((x+x+1)/2);
ans+=Asr(x,x+1,Simpson(x,x+1,Fa,Fb,Fab),Fa,Fb,Fab);
}
printf("%.3lf",ans);
return 0;
}

  

BZOJ2178 圆的面积并 计算几何 辛普森积分的更多相关文章

  1. 【BZOJ2178】圆的面积并(辛普森积分)

    [BZOJ2178]圆的面积并(辛普森积分) 题面 BZOJ 权限题 题解 把\(f(x)\)设为\(x\)和所有圆交的线段的并的和. 然后直接上自适应辛普森积分. 我精度死活一个点过不去,不要在意我 ...

  2. BZOJ2178 圆的面积并(simpson积分)

    板子题.可以转一下坐标防止被卡.精度和常数实在难以平衡. #include<iostream> #include<cstdio> #include<cmath> # ...

  3. [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并

    [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并 题目大意: 求\(n(n\le1000)\)个圆的面积并. 思路: 对于一个\( ...

  4. BZOJ2178: 圆的面积并(格林公式)

    题面 传送门 题解 好神仙-- 先给几个定义 平面单连通区域:设\(D\)是平面内一区域,若属于\(D\)内任一简单闭曲线的内部都属于\(D\),则称\(D\)为单连通区域.通俗地说,单连通区域是没有 ...

  5. bzoj2178: 圆的面积并

    Description 给出N个圆,求其面积并 Input 先给一个数字N ,N< = 1000 接下来是N行是圆的圆心,半径,其绝对值均为小于1000的整数 Output 面积并,保留三位小数 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 【原创】大数据基础之Marathon(2)marathon-lb

    marathon-lb 官方:https://github.com/mesosphere/marathon-lb 一 简介 Marathon load balancer (Marathon-LB) i ...

  2. 2018谷歌I/O开发者大会8大看点汇总 新品有哪些

    2018谷歌I/O开发者大会8大看点汇总 新品有哪些美国科技媒体The Verge近日撰文,列举了在即将召开的2018年谷歌I/O开发者大会上的8大看点,包括Android P.人工智能等等. 以下为 ...

  3. STM32L476应用开发之三:串行通讯实验

    在我们的项目需求中,有两个串口应用需求,一个是与炭氢传感器的通讯,另一个是与显示屏的通讯.鉴于此,我们需要实验串行通讯. 1.硬件设计 串行通讯一个采用RS232接口,另一个直接采用TTL方式.我们在 ...

  4. 【python】del

    参考:http://blog.csdn.net/love1code/article/details/47276683 del 删除的是变量,不是数据! if __name__=='__main__': ...

  5. Practical Web Penettation Testing (the first one Mutillidae 大黄蜂)

    1.now we looke at this book . I decide  to make a brief review the book covers as follows (I straigh ...

  6. poj2411 状态压缩-铺地板题型-轮廓线解法(最优)

    解法参考博客https://blog.csdn.net/u013480600/article/details/19569291 一种做法是先打出所有的状态,即满足上下配对的所有可能方案,然后再逐行进行 ...

  7. MySQL修改数据表存储引擎的3种方法介绍

    这篇文章主要介绍了MySQL修改数据表存储引擎的3种方法介绍,分别是直接修改.导出导入.创建插入3种方法, 可以参考下   MySQL作为最常用的数据库,经常遇到各种各样的问题.今天要说的就是表存储引 ...

  8. Redis都有哪些数据类型

    string 这是最基本的类型了,就是普通的set和get,做简单的kv缓存 hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存 ...

  9. webpack学习笔记--整体配置结构

    之前的章节分别讲述了每个配置项的具体含义,但没有描述它们所处的位置和数据结构,下面通过一份代码来描述清楚: const path = require('path'); module.exports = ...

  10. (转载)dotnet core 中文乱码 codepages

    引子 转载自:http://www.jianshu.com/p/1c9c59c5749a 参考:.Net Core 控制台输出中文乱码 上文中我查阅了一些cli的源码, 闲来无事就继续翻代码, 冥冥之 ...