2178: 圆的面积并

Time Limit: 20 Sec  Memory Limit: 259 MB
Submit: 1740  Solved: 450
[Submit][Status][Discuss]

Description

给出N个圆,求其面积并

Input

先给一个数字N ,N< = 1000 接下来是N行是圆的圆心,半径,其绝对值均为小于1000的整数

Output

面积并,保留三位小数

太可怕了!!!!!!

直接上辛普森积分 函数值就是x=..线上的区间并

区间并直接排序扫描就可以了

Xcode太愚蠢了样例那么大貌似把控制台崩掉了

不停的T啊....最后发现是辛普森积分写丑了......

结果我写的可能还是太丑了,超过10s.....那些快的都没用辛普森积分吧

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=,INF=1e9;
const double eps=1e-;
inline int sgn(double x){
if(abs(x)<eps) return ;
else return x<?-:;
}
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n;
struct Interval{
double l,r;
bool operator <(const Interval &a) const{
return l==a.l?r<a.r:l<a.l;
}
Interval(double a=,double b=):l(a),r(b){}
}a[N],b[N]; struct Circle{
int x,y,r;
Circle(){}
Circle(int x,int y,int r):x(x),y(y),r(r){}
Interval f(double p){
double dx=x-p,t=sqrt(r*r-dx*dx);
return Interval(y-t,y+t);
}
}C[N];
double Dis(Circle a,Circle b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool del[N];
void iniCircle(){
for(int i=;i<=n;i++) if(!del[i])
for(int j=i+;j<=n;j++) if(!del[j])
if(Dis(C[i],C[j])<=abs(C[i].r-C[j].r)){
if(C[i].r>C[j].r) del[j]=;
else del[i]=;
}
int p=;
for(int i=;i<=n;i++) if(!del[i]) C[++p]=C[i];
n=p;
}
inline double F(double x){
int m=;
for(int i=;i<=n;i++)
if(C[i].x-C[i].r<=x&&x<=C[i].x+C[i].r) a[++m]=C[i].f(x);
sort(a+,a++m);
double last=-INF,re=;
for(int i=;i<=m;i++){
if(a[i].l>last) re+=a[i].r-a[i].l,last=a[i].r;
else if(a[i].r>last) re+=a[i].r-last,last=a[i].r;
}
return re;
} inline double cal(double l,double r){
return (F(l)+F(r)+*F((l+r)/))*(r-l)/;
}
inline double cal(double l,double r,double fl,double fr,double fm){
return (fl+fr+*fm)*(r-l)/;
}
double Simpson(double l,double r,double now,double fl,double fr,double fm){
double mid=(l+r)/,flm=F((l+mid)/),frm=F((mid+r)/);
double p=cal(l,mid,fl,fm,flm),q=cal(mid,r,fm,fr,frm);
if(sgn(now-p-q)==) return now;
else return Simpson(l,mid,p,fl,fm,flm)+Simpson(mid,r,q,fm,fr,frm);
} double lb=INF,rb=-INF;
int main(int argc, const char * argv[]) {
n=read();
for(int i=;i<=n;i++){//printf("i %d\n",i);
C[i].x=read();C[i].y=read();C[i].r=read();
lb=min(lb,(double)C[i].x-C[i].r);
rb=max(rb,(double)C[i].x+C[i].r);
}
iniCircle();
//printf("%d\n",n);
double fl=F(lb),fr=F(rb),fm=F((lb+rb)/);
printf("%.3lf",Simpson(lb,rb,cal(lb,rb,fl,fr,fm),fl,fr,fm));
return ;
}

BZOJ 2178: 圆的面积并 [辛普森积分 区间并]的更多相关文章

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

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

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

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

  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. [国嵌攻略][149][Yaffs2文件系统应用]

    嵌入式系统自启动 MTD技术通过把Nand FLash划分成bootloader分区,Linux kernel分区和file system分区来达到自启动的效果. 配置和编译内核 1.配置Linux内 ...

  2. [学习OpenCV攻略][005][视频播放控制]

    cvSetCaptureProperty(视频,属性,属性值) 设置视频的属性,属性可以是宏CV_CAP_PROP_POS_FRAMES 视频帧的位置 cvGetCaptureProperty(视频, ...

  3. APP测试时常用adb命令

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备(手机),故在其实工作可以给我们 ...

  4. Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗?

    8:08:01 青春阳光 2017/4/7 8:08:01 大神在吗? Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗? 青春阳光 2017/4/7 8:08:20 还有个问题,上传到pu ...

  5. php-cli和php-fpm的关系是什么?

    CLI是命令行版本.FPM是作为Apache或者Nginx等服务器软件处理PHP文件的扩展. PHP的默认版本是不支持线程安全的,这个线程安全问题可以去了解PHP扩展开发方面的相关知识,这是因为C语言 ...

  6. dedecms的include文件夹是干什么的?

    include是DEDECMS的系统文件夹,里面放的是DEDECMS系统下的一些系统功能函数文件和功能定义与说明以及参数的文件. include目录文件作用解析 arc.archives.class ...

  7. RGB颜色设置错误

    [UIColor colorWithRed:<#(CGFloat)#> green:<#(CGFloat)#> blue:<#(CGFloat)#> alpha:& ...

  8. 关于多台机器之前session共享,sessionState mode="StateServer" 问题的困扰

    .net 多台机器共享session是很老的技术,一直很少用到session. 最近就出现了一个问题:三台前端,其中一台保存的session值死活不对,一样的环境,一样的配置文件,就是和另外两台获得的 ...

  9. javascript对象的标签

    [[proto]]标签 [[class]]标签 [[class]] 标签,代表这对象是哪个类型的.在js中不能直接访问到.可以通过Object.prototype.toString.call(obj) ...

  10. 第二章 在HTML中使用JS

    script 标签 属性 src   : 可选 包含要执行的外部文件 type : 表示编写代码使用的脚本语言的内容类型(MINI类型) text/javascript async: 可选 只对外部脚 ...