BZOJ 2178 Simpson积分

思路:

我发现能用Simpson积分水的题  好像都是裸题诶233333

//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
#define pr pair<double,double>
const int N=1050;
int n,ban[N];double inf=1e100,l=inf,r=-inf;pr p[N];
struct Point{int x,y;};
double dis(Point a,Point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
struct Circle{
    Point p;int r;
    pr f(double x){
        if(r<=abs(p.x-x))return pr(0,0);
        double t=sqrt(r*r-(p.x-x)*(p.x-x));
        return pr(1.0*p.y-t,1.0*p.y+t);
    }
}c[N];
double Cut(double x){
    double ret=0,last=-inf;int cnt=0;
    for(int i=1;i<=n;i++){
        p[++cnt]=c[i].f(x);
        if(p[cnt]==pr(0,0))cnt--;
    }
    sort(p+1,p+1+cnt);
    for(int i=1;i<=cnt;i++){
        if(p[i].first>last)ret+=p[i].second-p[i].first,last=p[i].second;
        else if(p[i].second>last)ret+=p[i].second-last,last=p[i].second;
    }return ret;
}
double Simpson(double l,double r,double mid,double Cl,double Cr,double Cm){
    double tCl=Cut((l+mid)/2),tCr=Cut((mid+r)/2);
    double ans=(r-l)*(Cl+Cr+4*Cm)/6,lans=(mid-l)*(Cl+Cm+4*tCl)/6,rans=(r-mid)*(Cr+Cm+4*tCr)/6;
    if(abs(lans+rans-ans)<1e-13)return ans;
    else return Simpson(l,mid,(l+mid)/2,Cl,Cm,tCl)+Simpson(mid,r,(mid+r)/2,Cm,Cr,tCr);

}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&c[i].p.x,&c[i].p.y,&c[i].r);
        l=min(l,(double)c[i].p.x-c[i].r);
        r=max(r,(double)c[i].p.x+c[i].r);
    }
    for(int i=1;i<=n;i++){
        if(ban[i])continue;
        for(int j=i+1;j<=n;j++){
            if(ban[j])continue;
            if(dis(c[i].p,c[j].p)<=c[i].r-c[j].r)ban[j]=1;
        }
    }
    for(int i=1;i<=n;i++)if(ban[i])swap(ban[i],ban[n]),swap(c[i--],c[n--]);
    printf("%.3lf\n",Simpson(l,r,(l+r)/2,0,0,Cut((l+r)/2)));
}
时间: 2024-10-07 21:20:33

BZOJ 2178 Simpson积分的相关文章

BZOJ 1845 Simpson积分

思路: Simpson积分直接上  限制一下递归深度+精度就好了 (难以理解为什么这么多人写扫描线) //By SiriusRen #include <bits/stdc++.h> using namespace std; #define pr pair<double,double> const int N=105; int n; double inf=10000000,eps=1e-8,l=inf,r=-inf; pr p[N]; struct Triangle{double x

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

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

BZOJ 2178 圆的面积并 Simpson积分

题意:链接 方法: Simpson积分 解析: 这题是有正解的=-= 不过Simpson积分可过. 首先 ∫rlf(x)=(r?l)(f(l)+f(r)+4f(mid))6 然后就强行递归搞就行了. 至于f(i)的值,在本题就是x=i这条直线与所有可以相交的圆的截线长的和. 这个的话用勾股定理求即可. 然后有一个方法 Simpson积分自适应法=-= 我们只需要强行套用公式,然后检验左半边的如上函数值加上右半边的如上函数值与我们强行套用公式得出来的值是否在精度范围允许内,如果在的话直接retur

BZOJ 1502 [NOI2005]月下柠檬树 自适应Simpson积分

题意:链接 方法:自适应Simpson积分 解析: 大半夜刷这道题真是爽歪歪. 求一棵树(圆锥加圆台组成)在平面上的投影的面积. 给定投影角度(0.3 < alpha <= pi/2). 先来想想圆的投影是什么样子 还是他自己. 再想圆锥投影是什么样子 一个点加一个圆,并且有这个点与该圆的两条切线(该点在圆内部时没有切线) 再想圆台 两个圆,加上两个圆的外公切线组成的一坨图形. 不妨随意画一个. 好难画- -! 大概就转化成这个样子了. 观察这个图形- 轴对称啊- -! 这意味着我们好多东西都

SPOJ CIRU The area of the union of circles ——Simpson积分

[题目分析] 圆的面积并. 直接Simpson积分,(但是有计算几何的解法,留着flag). simpson积分,如果圆出现了不连续的情况,是很容易出事情的.(脑补一下) 但是没有什么办法,本来就是一种取巧的做法,还能指望这暴力积分做什么. [代码] #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include &l

HDU 1724 Ellipse 【自适应Simpson积分】

Ellipse Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1977    Accepted Submission(s): 832 Problem Description Math is important!! Many students failed in 2+2's mathematical test, so let's AC t

自适应Simpson积分

一般用于在坐标系上求面积. 公式是\( S=\frac{f(l)+4*f(mid)+f(r)}{6} \),其中f为对应x的y值.也就是用二次函数拟合. 至于为什么是自适应:因为使用二次函数拟合,所以对于一段x区间[a,b],考虑对[a,b]求S,再求[a,(a+b)/2]和[(a+b)/2,b]的S和.然后看这两部分的差是否在eps内,是的话则返回答案,否则递归求解[a,(a+b)/2]和[(a+b)/2,b].这样一来,对于比较波折的段,会递归到较为精确的[a,b],对于较平滑的段则会去少数

【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分

[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月光的照射下柠檬树投在地面上的影子是如此的清晰,马上想到了一个问题:树影的面积是多大呢?李哲知道,直接测量面积是很难的,他想用几何的方法算,因为他对这棵柠檬树的形状了解得非常清楚,而且想好了简化的方法.李哲将整棵柠檬树分成了n 层,由下向

HDU - 1724 Ellipse(simpson积分)(入门模板题)

原题链接 题意: 给定 a,b,l,r,求 与x = l,x = r 围成的封闭图形的面积. 思路: 大佬可以直接算一下原函数就出来了,当没法计算或者很难计算的时候就可以用 自适应simpson 积分来逼近真实值. 1 /* 2 * @Author: windystreet 3 * @Date: 2018-08-04 16:24:01 4 * @Last Modified by: windystreet 5 * @Last Modified time: 2018-08-04 16:24:33 6