题目链接:BZOJ - 2178

题目分析

用Simpson积分,将圆按照 x 坐标分成连续的一些段,分别用 Simpson 求。

注意:1)Eps要设成 1e-13  2)要去掉被其他圆包含的圆。

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; typedef double LF; const LF Eps = 1e-13; const int MaxN = 1000 + 5; int n, Lc, Rc, Top, Tot; LF Lx, Rx, Ans; inline LF gmin(LF a, LF b) {return a < b ? a : b;}
inline LF gmax(LF a, LF b) {return a > b ? a : b;}
inline LF Sqr(LF x) {return x * x;} struct Point
{
LF x, y;
Point() {}
Point(LF a, LF b)
{
x = a; y = b;
}
}; inline LF Dis(Point p1, Point p2)
{
return sqrt(Sqr(p1.x - p2.x) + Sqr(p1.y - p2.y));
} struct Circle
{
Point o;
LF r;
} C[MaxN], S[MaxN]; inline bool Cmp1(Circle c1, Circle c2)
{
return c1.r < c2.r;
} inline bool Cmp2(Circle c1, Circle c2)
{
return c1.o.x - c1.r < c2.o.x - c2.r;
} bool Del[MaxN]; struct Segment
{
LF l, r;
} Seg[MaxN]; inline bool Cmp3(Segment s1, Segment s2)
{
return s1.l < s2.l;
} inline LF f(LF x)
{
LF ret = 0.0, p, q, Hi;
Top = 0;
for (int i = Lc; i <= Rc; ++i)
{
if (x <= S[i].o.x - S[i].r || x >= S[i].o.x + S[i].r) continue;
Hi = sqrt(Sqr(S[i].r) - Sqr(S[i].o.x - x));
Seg[++Top].l = S[i].o.y - Hi; Seg[Top].r = S[i].o.y + Hi;
}
sort(Seg + 1, Seg + Top + 1, Cmp3);
for (int i = 1, j; i <= Top; ++i)
{
p = Seg[i].l; q = Seg[i].r;
for (j = i + 1; j <= Top; ++j)
{
if (Seg[j].l > q) break;
if (Seg[j].r > q) q = Seg[j].r;
}
ret += q - p; i = j - 1;
}
return ret;
} inline LF Simpson(LF l, LF r, LF fl, LF fmid, LF fr)
{
return (fl + 4.0 * fmid + fr) * (r - l) / 6.0;
} inline LF RSimpson(LF l, LF r, LF fl, LF fmid, LF fr)
{
LF mid, p, q, x, y, z;
mid = (l + r) / 2.0;
p = f((l + mid) / 2.0); q = f((mid + r) / 2.0);
x = Simpson(l, r, fl, fmid, fr);
y = Simpson(l, mid, fl, p, fmid);
z = Simpson(mid, r, fmid, q, fr);
if (fabs(x - y - z) < Eps) return y + z;
else return RSimpson(l, mid, fl, p, fmid) + RSimpson(mid, r, fmid, q, fr);
} int main()
{
scanf("%d", &n);
int a, b, c;
for (int i = 1; i <= n; ++i)
{
scanf("%d%d%d", &a, &b, &c);
C[i].o = Point((LF)a, (LF)b);
C[i].r = (LF)c;
}
sort(C + 1, C + n + 1, Cmp1);
memset(Del, 0, sizeof(Del));
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
if (Dis(C[i].o, C[j].o) <= C[j].r - C[i].r)
{
Del[i] = true;
break;
}
Tot = 0;
for (int i = 1; i <= n; ++i)
if (!Del[i]) S[++Tot] = C[i];
sort(S + 1, S + Tot + 1, Cmp2);
Ans = 0.0;
for (int i = 1, j; i <= Tot; ++i)
{
Lc = i; Rc = i; Lx = S[i].o.x - S[i].r; Rx = S[i].o.x + S[i].r;
for (j = i + 1; j <= Tot; ++j)
{
if (S[j].o.x - S[j].r > Rx) break;
if (S[j].o.x + S[j].r > Rx) Rx = S[j].o.x + S[j].r;
}
Rc = j - 1; i = j - 1;
Ans += RSimpson(Lx, Rx, f(Lx), f((Lx + Rx) / 2.0), f(Rx));
}
printf("%.3lf\n", Ans);
return 0;
}

  

[BZOJ 2178] 圆的面积并 【Simpson积分】的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. BZOJ 1502 月下柠檬树(simpson积分)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...

随机推荐

  1. docker-proxy 实现容器代理访问

    可实现多个容器web主机对外提供访问 运行代理容器 nginx-proxy docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.soc ...

  2. [PHP] csv to xml

    <?php error_reporting(E_ALL | E_STRICT); ini_set('display_errors', true); ini_set('auto_detect_li ...

  3. nodejs保存文件的问题

    从前端到那里jar包失败: 保存到本地管理机jar包md5sum上传正确的值md5sum值不相等.并上传 处理 没有错误,说明保存过程中的错误: 前面是base64然后转码后jar包内容放进reque ...

  4. java多线程样例

    这里我们做一个完整的样例来说明线程产生的方式不同而生成的线程的差别: package debug; import java.io.*;import java.lang.Thread; class My ...

  5. qemu 的方式安装debian 模拟powerpc

    http://bbs.pediy.com/showthread.php?p=1424746http://www.ibm.com/developerworks/cn/linux/l-qemu/ 线总结下 ...

  6. Oracle 设置archivelog错误解决方案

    在Oracle 数据库的实际应用中,开启archivelog模式是必不可少的,但是在设置archivelog的过程中,可能因为不小心出现错误,导致数据库无法启动,本案例就是一种情况. 误操作现象: 设 ...

  7. 第八篇:web之前端踩的一些坑

    前端踩的一些坑   前端踩的一些坑 本节内容 事件代理 清除标签的所有事件 bootstrap的模态框自定义方法 ajax在django里面实现post提交 ajax提交数据嵌套 1.事件代理 之前写 ...

  8. android获取Mac地址和IP地址

    获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...

  9. Oracle 特殊字符模糊查询的方法

    最近在写DAO层的时候,遇到一个问题,就是使用like进行模糊查询时,输入下划线,无法精确查到数据,而是返回所有的数据. 这让我很好奇,百度之后才发现,原来是因为有些特殊字符需要进行转义才可以进行查询 ...

  10. Asp.net Mvc对比Php的4大误解

    一:asp.net技术已过时,Php技术更新 Asp.net mvc 5 发布于2014 夏天. 二:php开发者更多,所以更能得到帮助 2者对比犹如下图,会拿电锯的肯定多少会点锯子, 会用锯子的不一 ...