Solution -「SPOJ-VCIRCLES」Area of Circles
\(\mathcal{Description}\)
Link.
求平面上 \(n\) 个圆的并的面积。
\(n\le50\),可能被圆覆盖的横纵坐标区域在 \([-10^4,10^4]\)。
\(\mathcal{Solution}\)
做了那么多计算几何之后写了这道不那么计算几何的计算几何题的题解。
若想直接处理面积,就需要处理圆的各种相交关系,但是仅计算在某个 \(x_0\) 处,被圆的并覆盖的线段长度是很好处理地:每次 \(\mathcal O(n\log n)\) 排序后扫一遍即可。我们记 \(f(x)\) 表示 \(x_0=x\) 时,被圆的并覆盖的线段长度。所以问题转为求 \(\int_{-\infty}^{+\infty}f(x)dx\)。
运用自适应 Simpson 积分,有 Simpson 公式:
\]
其本质是用二次函数 \(g\) 近似地替换一个复杂的函数 \(f\),即设:
\]
利用 \(g(x)\) 化简积分,注意 \(g\) 仅是一种形式,我们的目的使用 \(f\) 的一些点值近似表示原积分。推导:
\]
记 \(h(a,b)=\frac{b-a}6\left(f(a)+4f(\frac{a+b}2)+f(b)\right)\),自适应 Simpson 积分的表达式如下:
\]
其中 \(\approx^*\) 根据题目精度要求等自行判断。若精度不合适,则递归求解提升精确度。
注意自适应 Simpson 积分只能处理平滑函数。例如依照上述算法,\(\int_0^{2\pi}|\sin x|\text dx=0\)(大雾)。
回到本题,结合求 \(\mathcal O(n\log n)\) 求 \(f(x_0)\) 的方法近似求出 \(\int_{-\infty}^{+\infty}f(x)dx\) 即可。复杂度与圆的位置和要求精度有关(aka. 我不知道 qwq)。
\(\mathcal {Code}\)
讲道理若某两块并在 \(x\) 轴上的投影相离应该分开求积分,但那样写我 WA 掉了 qwq。
/* Clearink */
#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
typedef std::pair<double, double> PDD;
const int MAXN = 50;
const double EPS = 1e-9;
int n;
bool ban[MAXN + 5];
inline double sqr ( const double a ) { return a * a; }
inline double dabs ( const double a ) { return a < 0 ? -a : a; }
inline double dmin ( const double a, const double b ) { return a < b ? a : b; }
inline double dmax ( const double a, const double b ) { return a < b ? b : a; }
struct Circle { double x, y, r; } O[MAXN + 5];
inline double func ( const double x ) {
static std::vector<PDD> sec; sec.clear ();
for ( int i = 1; i <= n; ++i ) {
const Circle& C ( O[i] );
if ( dabs ( x - C.x ) < C.r ) {
double yd = sqrt ( sqr ( C.r ) - sqr ( dabs ( C.x - x ) ) );
sec.push_back ( { C.y - yd, C.y + yd } );
}
}
std::sort ( sec.begin (), sec.end () );
double las = -1e9, ret = 0;
for ( PDD s: sec ) {
las = dmax ( las, s.first );
ret += dmax ( 0, s.second - las );
las = dmax ( las, s.second );
}
return ret;
}
inline double scalc ( const double lx, const double rx,
const double fl, const double fm, const double fr ) {
return ( fl + 4 * fm + fr ) / 6 * ( rx - lx );
}
inline double simpson ( const double lx, const double rx,
const double fl, const double fm, const double fr ) {
double mx = 0.5 * ( lx + rx );
double fll = func ( 0.5 * ( lx + mx ) ), frr = func ( 0.5 * ( mx + rx ) );
double s = scalc ( lx, rx, fl, fm, fr );
double sl = scalc ( lx, mx, fl, fll, fm ), sr = scalc ( mx, rx, fm, frr, fr );
if ( dabs ( s - sl - sr ) < EPS ) return sl + sr;
return simpson ( lx, mx, fl, fll, fm ) + simpson ( mx, rx, fm, frr, fr );
}
int main () {
scanf ( "%d", &n );
double mn = 1e9, mx = -1e9;
for ( int i = 1; i <= n; ++i ) {
scanf ( "%lf %lf %lf", &O[i].x, &O[i].y, &O[i].r );
mn = dmin ( mn, O[i].x - O[i].r );
mx = dmax ( mx, O[i].x + O[i].r );
}
printf ( "%.5f\n", simpson ( mn, mx,
func ( mn ), func ( 0.5 * ( mn + mx ) ), func ( mx ) ) );
return 0;
}
Solution -「SPOJ-VCIRCLES」Area of Circles的更多相关文章
- 「SPOJ 3105」Power Modulo Inverted
「SPOJ 3105」Power Modulo Inverted 传送门 题目大意: 求关于 \(x\) 的方程 \[a^x \equiv b \;(\mathrm{mod}\; p) \] 的最小自 ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「BZOJ 3812」主旋律
\(\mathcal{Description}\) Link. 给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「简单 DP」zxy 讲课记实
魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...
- Solution -「基环树」做题记录
写的大多只是思路,比较简单的细节和证明过程就不放了,有需者自取. 基环树简介 简单说一说基环树吧.由名字扩展可得这是一类以环为基础的树(当然显然它不是树. 通常的表现形式是一棵树再加一条非树边,把图画 ...
- Solution -「WC 2022」秃子酋长
\(\mathscr{Description}\) Link. (It's empty temporarily.) 给定排列 \(\{a_n\}\),\(q\) 次询问,每次给出 \([l,r ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
随机推荐
- Java基础复习到此结束,统一把源码放到GitHub仓库了,响应开源精神
这是地址 https://github.com/cen-xi/java-baisc-
- SSM实现支付宝支付
学习支付宝支付 一.支付宝测试环境代码测试 1.下载电脑网站的官方demo: 下载地址:https://docs.open.alipay.com/270/106291/ 2.下载解压导入eclipse ...
- 经典定长指令-修改EIP
1.0x70~0x7F EIP无法像通用寄存器那样用mov来修改,只能通过类似于jz,JNB,JNE JBE,call等的跳转指令来进行修改 条件跳转,后跟一个字节立即数的偏移(有符号),共两个字节. ...
- SYCOJ570传纸条
题目-传纸条 (shiyancang.cn) 算法(线性DP) O(n3)O(n3)首先考虑路径有交集该如何处理.可以发现交集中的格子一定在每条路径的相同步数处.因此可以让两个人同时从起点出发,每次同 ...
- 记一次ARM服务器(鲲鹏920)的PXE批量装机遇到的坑
由于近期项目需要,在对一批华为鲲鹏920的ARM服务器(型号为天宫TG225 B1)进行批量装机的过程中,遇到了各种各样千奇百怪的bug(换个高情商的说法就是遇到了各种各样和x86服务器不一样的地方) ...
- Feed流系统重构-架构篇
重构,于我而言,很大的快乐在于能够解决问题. 第一次重构是重构一个c#版本的彩票算奖系统.当时的算奖系统在开奖后,算奖经常超时,导致用户经常投诉.接到重构的任务,既兴奋又紧张,花了两天时间,除了吃饭睡 ...
- dart系列之:和null说再见,null使用最佳实践
目录 简介 不需要初始化对象为null null的三元操作符 如果在使用中需要判断类型是否为空,则不要使用late 本地变量的类型提升 总结 简介 null可能是大家在编写程序中最为头疼的一个东西,稍 ...
- JuiceFS v1.0.0 Beta1 发布,加强数据安全能力
在 JuiceFS 开源一周年之际,我们迎来了首个里程碑版本 JuiceFS v1.0.0 Beta1,并将开源许可从 AGPL v3 修改为 Apache License 2.0. JuiceFS ...
- Spring系列4:依赖注入的2种方式
本文内容 基于构造器的依赖注入 基于setter的依赖注入 基于构造器的依赖注入 案例 定义2个简单的bean类,BeanOne 和 BeanTwo,前者依赖后者. package com.crab. ...
- django-环境搭建-开使hello world!
django的环境安装非常简单,只需用pip安装一个django库就可以了,编辑器选择pycharm pip install django==2.1.2 查看版本号:pip show django C ...