BZOJ 4789: [CERC2016]Convex Contour

来源:互联网 发布:ios6.1.3软件源 编辑:程序博客网 时间:2024/06/11 04:05

神TM数学题。。。
这种题 还是尽量把自己的代码简单化 特别是讨论部分。。不然烦死你

前后分别搞一下第一个不是三角形的,中间剩下的肯定都是那样了。。
圆形和三角形就用一下三角恒等变换+acos函数就好
(一开始还没想到怎么弄…画画图就好 利用好什么垂直之类的
注意一下 首尾的特殊情况

#include<bits/stdc++.h>using namespace std;inline int read(){    char ch=getchar(); int x=0,f=1;    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}    return x*f;}inline double pf(double x){return x*x;}char c[22];int main(){    int n=read(),i,st;    scanf("%s",c+1);    double ans;    for(i=1;i<=n && c[i]=='T';++i) ;    if(i>n){        printf("%.8lf\n",n*2.0+1); return 0;    }    if(c[i]=='S'){        if(i==1) ans=3.0;        else ans=i+2+ sqrt( pf(2-sqrt(3))/4.0+pf(i-1.5) );        if(i==n){printf("%.8lf\n",ans+1.0); return 0;}    }    if(c[i]=='C'){        if(i==1) ans=acos(-1.0)/2.0+1.0;        else{            double u= sqrt( pf(i-1)+pf(sqrt(3)-1)/4.0),o=sqrt(u*u-1/4.0);            double s1= (sqrt(3)-1)/2.0/u, c1=(i-1)/u;            double s2= o/u, c2=1/2.0/u;            ans= i+1.5+o+acos(s1*c2+c1*s2)*0.5;        }        if(i==n){printf("%.8lf\n",ans-1.0+acos(-1.0)/2.0); return 0;}    }    st=i;    for(i=n;i>0 && c[i]=='T';--i) ;    if(c[i]=='S'){        if(i==n){            printf("%.8lf\n",ans+(n-st)*2.0+1);            return 0;        }        ans+= sqrt( pf(2-sqrt(3))/4.0+pf(n-i-0.5) );        ans+= n-i+3 + 2*(i-st-1);        printf("%.8lf\n",ans);    }    else{        if(i==n){            printf("%.8lf\n",ans+(n-st)*2.0-1+acos(-1.0)/2.0);            return 0;        }        double u= sqrt( pf(n-i)+pf(sqrt(3)-1)/4.0),o=sqrt(u*u-1/4.0);        double s1= (sqrt(3)-1)/2.0/u, c1=(n-i)/u;        double s2= o/u, c2=1/2.0/u;        ans+= n-i+2.5+ (i-st-1)*2 +o+acos(s1*c2+c1*s2)*0.5;        printf("%.8lf\n",ans);    }    return 0;}
原创粉丝点击