agc039 D

重心:三条中线的交点,
垂心:三条高的交点
内心:三条角平分线的交点
外心:三条垂直平分线的交点

考虑一个圆上的三角形ABC,我们取这三段弧的中点,记为A' B' C'
题解开始啦!『It can be proved here that』ABC的内心和A'B'C'的垂心是一样的
题解又开始啦!『 it is known that』对于一个三角形,它的垂心、重心、外心在一条直线上,并且|垂心-重心|:|重心-外心| = 2:1
然后我们其实要找的是A'B'C'的垂心,又A'B'C'的外心是(0,0),重心就是三点坐标的和除以3,所以垂心就是重心的坐标乘以三,也就是三点坐标的和了。

那么我们枚举两个点,考虑第三个点的贡献
不妨叫这两个点BC,显然A点在优弧上的时候,A'在劣弧上,反之亦然,
那么将贡献乘以点的个数即可

#include <bits/stdc++.h>
#define yxn inline
using namespace std;
typedef double db;
typedef long long ll;
const db pi = acos(-1);
int n,l;db t[3003],x,y;
yxn void add(db rad,int cnt){
    x+=cos(rad)*cnt;
    y+=sin(rad)*cnt;
}
int main(){
    scanf("%d%d",&n,&l);
    for(int i=0;i<n;i++){
        scanf("%lf",&t[i]);
        t[i]=t[i]/l*2*pi;
    }
    sort(t,t+n);
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            db m1=(t[i]+t[j])/2,m2=m1+pi;
            add(m1,i+n-j-1);
            add(m2,j-i-1);
        }
    }
    db all = 1.0*n*(n-1)*(n-2)/6;
    x/=all,y/=all;
    printf("%.11f %.11f\n",x,y);
}

猜你喜欢

转载自www.cnblogs.com/MXang/p/11627611.html