求助:样例过了,提交全WA
查看原帖
求助:样例过了,提交全WA
531223
gbk002SNake楼主2021/8/11 11:34
#include<bits/stdc++.h>
using namespace std;

const int MA=500009;
const double pi=acos(-1);
struct node
{
    double x,y;
    node(){}
    node(double a,double b){x=a,y=b;}
    bool operator<(node a)const 
    {
        if(x!=a.x)return x<a.x;
        return y<a.y;
    }
}e[MA],st[MA];
struct vec
{
    node a1,a2;
    vec(){}
    vec(node a,node b){a1=a;a2=b;}
    double operator^(vec a)const 
    {
    	return (a2.x-a1.x)*(a.a2.y-a.a1.y)-(a2.y-a1.y)*(a.a2.x-a.a1.x);
	}
};
int n,cnt;
double ai,bi,lx,ly,r;
void xz(double a,double b,double c)
{
    e[++cnt]=node(a+lx*cos(c)-sin(c)*ly,b+cos(c)*ly+lx*sin(c));
    e[++cnt]=node(a-lx*cos(c)-sin(c)*ly,b+cos(c)*ly-lx*sin(c));
    e[++cnt]=node(a+lx*cos(c)+sin(c)*ly,b-cos(c)*ly+lx*sin(c));
    e[++cnt]=node(a-lx*cos(c)+sin(c)*ly,b-cos(c)*ly-lx*sin(c));
}
double fac(double a)
{
    return a*a;
}
double dis(node a,node b)
{
    return sqrt(fac(a.x-b.x)+fac(a.y-b.y));
}
void work()
{
    sort(e+1,e+cnt+1);
    st[0]=e[1];
    st[1]=e[2];
    int tot=1;
    for(int i=3;i<=cnt;i++)
    {
        while(tot&&((vec(st[tot-1],st[tot])^vec(st[tot],e[i]))<=0))
        {
            tot--;
        }
        st[++tot]=e[i];
    }
    st[++tot]=e[cnt-1];
    for(int i=cnt-2;i;i--)
    {
        while(tot&&((vec(st[tot-1],st[tot])^vec(st[tot],e[i]))<=0))
        {
            tot--;
        }
        st[++tot]=e[i];
    }
    double ans;
    for(int i=0;i<tot;i++)
    {
        ans+=dis(st[i],st[i+1]);
    }
    ans+=pi*2*r;
    printf("%.2lf\n",ans);
}
signed main()
{
    cin>>n;
    cin>>ai>>bi>>r;
    lx=bi/2-r;
    ly=ai/2-r;
    for(int i=1;i<=n;i++)
    {
        double x,y,t;
        cin>>x>>y>>t;
        xz(x,y,t);
    }
    work();
    return 0;

}

改过long double\text{long double}也不对,应该不是精度问题,求大佬帮忙!

2021/8/11 11:34
加载中...