BZOJ1502 NOI2005 月下檸檬樹

2022-05-03 16:51:11 字數 1039 閱讀 3217

傳送門顯然的是,每乙個圓的影子,就是從樹上的圓按光線方向平移至地面的圓。至於兩個圓之間的連線部分,則是每兩個在樹上相鄰的圓的,對應的影子圓的,公切線圍起來的部分,如下圖所示

所以我們現在要求每兩個在原樹上相鄰的圓的影子圓構成的圖形的並。只看\(x\)軸上半部分,可以把它想象成乙個函式,求單點值是\(o(n)\)的,我們不妨用辛普森積分來解決......

相鄰圓的公切線和x軸的夾角是可以求出來的,然後就能解出公切線的解析式,以及有效範圍。注意這些東西要預處理!千萬不要放在求值函式裡面。\(eps\)大約設定到\(10^\)才不會出錯,效率也相對比較高。

#include #include using namespace std;

const int n=505;

const double eps=1e-7,inf=1e10,pi=3.14159265358979323846;

int n,sum;

double alpha,h[n],p[n],r[n];

double k[n],b[n],lx[n],rx[n];

bool exist[n];

inline double max(double x,double y)

inline double min(double x,double y)

double calc(int a,int b,double &k,double &bb,double &xl,double &xr)

else

}double f(double x)

double simpson(double l,double r)

double solve(double l,double r)

int main()

for(int i=1;i

double xl=inf,xr=-inf;

for(int i=1;i<=n;i++)

for(int i=1;i

printf("%.2lf\n",solve(xl,xr)*2);

return 0;

}

bzoj 1502 NOI2005 月下檸檬樹

檔案的第1行包含乙個整數n和乙個實數alpha,表示檸檬樹的層數和月亮的光線與地面夾角 單位為弧度 第2行包含n 1個實數h0,h1,h2,hn,表示樹離地的高度和每層的高度。第3行包含n個實數r1,r2,rn,表示檸檬樹每層下底面的圓的半徑。上述輸入檔案中的資料,同一行相鄰的兩個數之間用乙個空格分...

bzoj 2005 Noi2010 能量採集

description 棟棟有一塊長方形的地,他在地上種了一種能量植物,這種植物可以採集太陽光的能量。在這些植物採集能量後,棟棟再使用乙個能量匯集機器把這些植物採集到的能量匯集到一起。棟棟的植物種得非常整齊,一共有n列,每列有m棵,植物的橫豎間距都一樣,因此對於每一棵植物,棟棟可以用乙個座標 x,y...

BZOJ2005 Noi2010 能量採集

description 棟棟有一塊長方形的地,他在地上種了一種能量植物,這種植物可以採集太陽光的能量。在這些植物採集能量後,棟棟再使用乙個能量匯集機器把這些植物採集到的能量匯集到一起。棟棟的植物種得非常整齊,一共有n列,每列有m棵,植物的橫豎間距都一樣,因此對於每一棵植物,棟棟可以用乙個座標 x,y...