首页 > 其他 > 详细

BZOJ2178 圆的面积并(simpson积分)

时间:2019-01-19 10:26:18      阅读:165      评论:0      收藏:0      [点我收藏+]

  板子题。可以转一下坐标防止被卡。精度和常数实在难以平衡。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define double long double
#define N 1010
char getc(){char c=getchar();while ((c<A||c>Z)&&(c<a||c>z)&&(c<0||c>9)) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<0||c>9) {if (c==-) f=-1;c=getchar();}
    while (c>=0&&c<=9) x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
int n;
const double PI=acos(-1.0);
double x[N],y[N],r[N];
struct data
{
    double x;int op;
    bool operator <(const data&a) const
    {
        return x<a.x;
    }
}a[N<<1];
const double eps=1E-7;
double f(double k)
{
    int m=0;
    for (int i=1;i<=n;i++)
    if (fabs(x[i]-k)<r[i])
    {
        double t=sqrt(r[i]*r[i]-(x[i]-k)*(x[i]-k));
        a[++m].x=y[i]-t,a[m].op=1;
        a[++m].x=y[i]+t,a[m].op=-1;
    }
    sort(a+1,a+m+1);
    double ans=0,cur;int u=0;
    for (int i=1;i<=m;i++)
    {
        if (u==0) cur=a[i].x;
        u+=a[i].op;
        if (u==0) ans+=a[i].x-cur;
    }
    return ans;
}
double simpson(double l,double r)
{
    return (r-l)*(f(l)+f(r)+4*f((l+r)/2))/6;
}
double calc(double l,double r,double simp)
{
    double mid=(l+r)/2,x=simpson(l,mid),y=simpson(mid,r);
    if (fabs(x+y-simp)<eps) return x+y;
    else return calc(l,mid,x)+calc(mid,r,y);
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("bzoj2178.in","r",stdin);
    freopen("bzoj2178.out","w",stdout);
    const char LL[]="%I64d\n";
#else
    const char LL[]="%lld\n";
#endif
    n=read();double L=2000,R=-2000;
    for (int i=1;i<=n;i++)
    {
        x[i]=read(),y[i]=read(),r[i]=read();
        double u=x[i]*sin(PI/3)+y[i]*cos(PI/3),v=x[i]*cos(PI/3)-y[i]*sin(PI/3);
        x[i]=u,y[i]=v;
        L=min(L,x[i]-r[i]),R=max(R,x[i]+r[i]);
    }
#undef double
    printf("%.3f",(double)calc(L,R,simpson(L,R)));
    return 0;
}

 

BZOJ2178 圆的面积并(simpson积分)

原文:https://www.cnblogs.com/Gloid/p/10290365.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!