传送门:http://s8pc-3.contest.atcoder.jp/tasks/s8pc_3_e
感谢罗大神指点
三角形面积公式
S=absin(C)2
用正弦定理换掉ab,得
S=2sin(A)sin(B)sin(C)
那么变成统计角个数之类的,满足A+B+C=π
然后计数的时候可以不妨设A < B < C
二分面积枚举A二分B(明显A一定时,BC越接近,面积越大)
然后注意一下等腰和等边的计数即可
#include<cmath>
#include<iomanip>
#include<iostream>
#define A(a,b) S[a]*S[b]*S[n-a-b]*2
#define db long double
using namespace std;
typedef long long ll;
ll n,k,tot;
int lim,l,r,mid;
db S[200005],L,R,Mid,st;
int main()
{
cout<<setprecision(50);
cin>>n>>k;lim=n/3;st=3.14159265358979/n;
if (n%3==0 && n*(n-1)*(n-2)/6<k+n/3)
{
cout<<"1.29903810568";
return 0;
}
for (int i=1;i<=n;i++) S[i]=sin(i*st);
for (L=0,R=1.29903810568,Mid=(L+R)/2;L+0.0000000000001<R;Mid=(L+R)/2,tot=0)
{
for (int i=1;i<=lim;i++) if (A(i,i)<Mid)
{
for (l=i,r=n-i>>1,mid=l+r+1>>1;l<r;mid=l+r+1>>1) (A(i,mid)<Mid)?l=mid:r=mid-1;
tot+=(l+1-i<<1)-(i+l+l==n?(i==l?3:2):1);
}
if (k<=tot*n) R=Mid;else L=Mid;
}
cout<<L;
}

本文介绍了一种解决AtCoder平台上特定三角形面积问题的方法,通过利用正弦定理简化计算,并采用二分查找和计数策略来找到满足条件的三角形组合。
634

被折叠的 条评论
为什么被折叠?



