SPOJ CIRU
SPOJ CIRU
题意
给出n个圆,求他们覆盖的面积。
解法
自适应Simpson,但需要将圆离散化一下,以保证我们查询的是一个连续的有圆的区间。 奇怪的是我没有离散化,样例都没有过,却把题给A了
代码如下: ( 注意 :要去掉被覆盖的圆,才不会TLE)
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000+5;
struct cir {
double x,y,r;
cir(double x=0.0,double y=0.0,double r=0.0):x(x),y(y),r(r){}
double dh(double nowx) {
return sqrt( r*r - (nowx - x)*(nowx - x) );
}
bool operator < (const cir&a) const {
return r<a.r;
}
}c[maxn];
struct line {
double y;
bool k;
bool operator < (const line& a) const {
return y < a.y;
}
}temp[maxn];
int n;
double F(double x) {
int num=0;double ans=0.0;
for(int i=1;i<=n;i++) {
if(x>=c[i].x-c[i].r&&x<=c[i].x+c[i].r){
double dy=c[i].dh(x);
temp[++num].y=c[i].y-dy; temp[num].k=1;
temp[++num].y=c[i].y+dy; temp[num].k=0;
}
}
sort(temp+1,temp+1+num);
int f=0;double be;
for(int i=1;i<=num;i++) {
if(temp[i].k) {
if(!(f++)) {be=temp[i].y;}
}
else if(!(--f)) ans+=temp[i].y-be;
}
return ans;
}
double simpson(double a,double b) {
double mid=(a+b)/2;
return ( F(a) + 4*F(mid) + F(b) ) * (b - a) / 6;
}
double asr(double a,double b,double e,double A) {
double mid=(a+b)/2;
double L=simpson(a,mid),R=simpson(mid,b);
if( fabs(L+R-A) <= 15*e) return L+R+(L+R-A)/15;
return asr(a,mid,e/2,L)+asr(mid,b,e/2,R);
}
double asr(double l,double r,double eps) {
return asr(l,r,eps,simpson(l,r));
}
double dis(int a,int b){
return sqrt( (c[a].x-c[b].x)*(c[a].x-c[b].x)+(c[a].y-c[b].y)*(c[a].y-c[b].y) );
}
bool cover[maxn];
int main() {
scanf("%d",&n);
double l=2e33,r=-2e33;
for(int i=1;i<=n;i++) {
scanf("%lf%lf%lf",&c[i].x,&c[i].y,&c[i].r);
l=min(l,c[i].x-c[i].r);
r=max(r,c[i].x+c[i].r);
}
sort(c+1,c+1+n);
int cnt=n;n=0;
for(int i=1;i<cnt;i++)
for(int j=i+1;j<=cnt;j++){
if(dis(i,j)+c[i].r<=c[j].r){
cover[i]=1;
break;
}
}
for(int i=1;i<=cnt;i++)
if(!cover[i])
c[++n]=c[i];
printf("%.3lf",asr(l,r,1e-4));
return 0;
}
以下是加了离散化过后的版本。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000+5;
struct cir {
double x,y,r;
cir(double x=0.0,double y=0.0,double r=0.0):x(x),y(y),r(r){}
double dh(double nowx) {
return sqrt( r*r - (nowx - x)*(nowx - x) );
}
bool operator < (const cir&a) const {
return r<a.r;
}
}c[maxn];
struct line {
double y;
bool k;
bool operator < (const line& a) const {
return y < a.y;
}
}temp[maxn << 1],k[maxn << 1];
int n;
double F(double x) {
int num=0;double ans=0.0;
for(int i=1;i<=n;i++) {
if(x>=c[i].x-c[i].r&&x<=c[i].x+c[i].r){
double dy=c[i].dh(x);
temp[++num].y=c[i].y-dy; temp[num].k=1;
temp[++num].y=c[i].y+dy; temp[num].k=0;
}
}
sort(temp+1,temp+1+num);
int f=0;double be;
for(int i=1;i<=num;i++) {
if(temp[i].k) {
if(!(f++)) {be=temp[i].y;}
}
else if(!(--f)) ans+=temp[i].y-be;
}
return ans;
}
double simpson(double a,double b) {
double mid=(a+b)/2;
return ( F(a) + 4*F(mid) + F(b) ) * (b - a) / 6;
}
double asr(double a,double b,double e,double A) {
double mid=(a+b)/2;
double L=simpson(a,mid),R=simpson(mid,b);
if( fabs(L+R-A) <= 15*e) return L+R+(L+R-A)/15;
return asr(a,mid,e/2,L)+asr(mid,b,e/2,R);
}
double asr(double l,double r,double eps) {
return asr(l,r,eps,simpson(l,r));
}
double dis(int a,int b){
return sqrt( (c[a].x-c[b].x)*(c[a].x-c[b].x)+(c[a].y-c[b].y)*(c[a].y-c[b].y) );
}
bool cover[maxn];
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%lf%lf%lf",&c[i].x,&c[i].y,&c[i].r);
}
sort(c+1,c+1+n);
int cnt=n;n=0;
for(int i=1;i<cnt;i++)
for(int j=i+1;j<=cnt;j++){
if(dis(i,j)+c[i].r<=c[j].r){
cover[i]=1;
break;
}
}
for(int i=1;i<=cnt;i++)
if(!cover[i])
c[++n]=c[i];
cnt=0;
double ans=0.0;
for(int i=1;i<=n;i++){
k[++cnt].y=c[i].x-c[i].r; k[cnt].k=1;
k[++cnt].y=c[i].x+c[i].r; k[cnt].k=0;
}
sort(k+1,k+1+cnt);
int f=0;double be;
for(int i=1;i<=cnt;i++){
if(k[i].k) { if(!(f++)) be=k[i].y; }
else if(!(--f)) ans+=asr(be,k[i].y,1e-4);
}
printf("%.3f",ans);
return 0;
}
SPOJ CIRU的更多相关文章
- SPOJ CIRU SPOJ VCIRCLE 圆的面积并问题
SPOJ VCIRCLE SPOJ CIRU 两道题都是给出若干圆 就面积并,数据规模和精度要求不同. 求圆面积并有两种常见的方法,一种是Simpson积分,另一种是几何法. 在这里给出几何方法. P ...
- SPOJ CIRU - The area of the union of circles (圆的面积并)
CIRU - The area of the union of circles no tags You are given N circles and expected to calculate t ...
- SPOJ CIRU The area of the union of circles
You are given N circles and expected to calculate the area of the union of the circles ! Input The f ...
- SPOJ CIRU The area of the union of circles (计算几何)
题意:求 m 个圆的并的面积. 析:就是一个板子题,还有要注意圆的半径为0的情况. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024 ...
- SPOJ CIRU The area of the union of circles ——Simpson积分
[题目分析] 圆的面积并. 直接Simpson积分,(但是有计算几何的解法,留着flag). simpson积分,如果圆出现了不连续的情况,是很容易出事情的.(脑补一下) 但是没有什么办法,本来就是一 ...
- SPOJ 8073 The area of the union of circles(计算几何の圆并)(CIRU)
Description You are given N circles and expected to calculate the area of the union of the circles ! ...
- SPOJ 8073 The area of the union of circles (圆并入门)
Sphere Online Judge (SPOJ) - Problem CIRU [求圆并的若干种算法,圆并扩展算法]_AekdyCoin的空间_百度空间 参考AekdyCoin的圆并算法解释,根据 ...
- 【题解】CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178]
[题解]CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178] 传送门: \(\text{CIRU - The area ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
随机推荐
- JavaScript 三要素
一个完整的JavaScript 实现由3部分组成: ECMACcript ECMAScript 规定了这门语言的下列组成部分: 语法 类型 语句 关键字.保留字 操作符 对象为什么要使用DOM? ...
- nyoj14-会场安排问题
会场安排问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就 ...
- Problem 11
Problem 11 # Problem_11.py """ In the 20×20 grid below, four numbers along a diagonal ...
- Problem 1
Problem 1 # Problem_1.py """ If we list all the natural numbers below 10 that are mul ...
- BA-传感器
01.室内温度传感器 壁装,西门子,QAA2061D 1.默认范围:温度0-50℃,湿度0-100% 2.供电方式:24vac 3.穿线方式:4芯屏蔽线 02.风管温度传感器 西门子,QAM2120. ...
- 基于STM32的学习型通用红外遥控设备的设计实现(三)
CPU: STM32 调试平台: STM32F103ZET和STM32F103VBT 软件平台: Keil uVision4 电路设计: Altium Designer v6.9 http://blo ...
- HDU 5078 Revenge of LIS II(dp LIS)
Problem Description In computer science, the longest increasing subsequence problem is to find a sub ...
- [Erlang危机](4.2)Remsh
原创文章,转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface 联系邮箱:cto@188.com Remsh There's a mechan ...
- godoc工具使用
golang除了语言有一定的规范外,对于文档的生成也是非常不错的.仅仅要按go的格式来写的程序,都能够非常easy的生成文档. godoc命令介绍: http://golang.org/cmd/god ...
- hdoj--1251--统计难题(字典树)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...