BZOJ 1502 月下檸檬樹 自適應辛普森積分

2021-07-05 11:26:58 字數 1151 閱讀 8143

題意:給你一顆由n個圓台組成的檸檬樹,再給你乙個光線,問你這棵樹的投影的面積。

思路:由於光線是平行的,所以圓的投影還是原來的圓,樣例的投影如下圖:

其中de,cf為原來圓台的母線,現在為兩個圓的切線。最後無腦辛普森就好。。。具體的就是對於乙個下標x,暴力找到x這個位置的所有圓和切線的最大值。

#include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 500 + 10;

struct line

line(double x1, double y1, double x2, double y2, double k, double b) :

x1(x1), y1(y1), x2(x2), y2(y2), k(k), b(b){}

};int n;

double rad;

int line_cnt;

line line[maxn];

double h[maxn], r[maxn];

double f(double x)

}for(int i = 0; i < line_cnt; i++)

}return ans;

}double simpson(double a, double b)

double asr(double a, double b, double eps, double a)

double asr(double a, double b, double eps)

void solve()

double l = 1e9, r1 = 0;

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

line_cnt = 0;

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

printf("%.2lf\n", asr(l, r1, 1e-5) * 2);

}int main()

bzoj 1502 NOI2005 月下檸檬樹

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

BZOJ1502 NOI2005 月下檸檬樹

傳送門顯然的是,每乙個圓的影子,就是從樹上的圓按光線方向平移至地面的圓。至於兩個圓之間的連線部分,則是每兩個在樹上相鄰的圓的,對應的影子圓的,公切線圍起來的部分,如下圖所示 所以我們現在要求每兩個在原樹上相鄰的圓的影子圓構成的圖形的並。只看 x 軸上半部分,可以把它想象成乙個函式,求單點值是 o n...

NOI2005 月下檸檬樹

一堆圓台平行光的投影 在草稿紙上畫一下,發現對於乙個圓,它投影完還是乙個半徑不變的圓。定義樹的軸在投影平面上經過的點為原點,定乙個正方向,建立平面直角座標系,能發現,對於乙個半徑為 r 高度為 h 的圓,投影到平面上是圓心座標為 cot alpha h,0 半徑為 r 的圓 想象有乙個水平的平面,豎...