Bzoj1313 HAOI2008 下落的圓盤

2022-05-13 13:09:51 字數 2214 閱讀 9481

有 n 個圓盤從天而降,後面落下的可以蓋住前面的。最後按掉下的順序,在平面上依次測得每個圓盤的圓心和半徑,問下落完成後從上往下看,整個圖形的周長是多少,即你可以看到的圓盤的輪廓的圓盤的輪廓總長.例如下圖的黑色線條的總長度即為所求。

第一行為1個整數n

接下來n行每行3個實數,ri,xi,yi,表示下落時第i個圓盤的半徑和圓心座標.

僅乙個實數,表示所求的總周長,答案保留3位小數.

2

1 0 0

1 1 0

10.472
30%的資料,n<=10

100%的資料,n<=1000

數學問題 計算幾何

用餘弦定理和三角函式可以計算出兩圓相交部分的弧長。

對於每個圓,計算它和在它之後落下的所有圓的角。記錄相交部分的弧對應的圓心角範圍。將「圓心角」區間離散到0~2pi的數軸上,做線段覆蓋。

知道了未被覆蓋的角總共有多大,就能算出該圓未被覆蓋的弧有多長。

注意如果求出的覆蓋部分圓心角範圍超出了0~2pi,要變換到0~2pi範圍內

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8const

double pi=acos(-1.0);9

const

double eps=1e-7;10

const

int mxn=1010;11

struct

point;}

14 point operator - (point b);}

15double

operator * (point b)

16};

17 inline double

cross(point a,point b)

20 inline double

dist(point a,point b)

23 inline double len(point a)

24struct

cir;}

28 point operator - (cir b);}

29}c[mxn];

30 inline bool

cover(cir a,cir b)

33struct

line

38};

39line cx(cir a,cir b);

44/*

double t=(a.r*a.r+dis*dis-b.r*b.r)/(2*dis);

45double st=atan2(a.x-b.x,a.y-b.y);

46double l=acos(t/a.r);

47return (line);

*/48

}49 vectorve;

50int

n;51

double ans=0;52

void calc(int

x)//

被完全覆蓋

54ve.clear();

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

64 ve.push_back((line));65}

66else

ve.push_back(tmp);67}

68sort(ve.begin(),ve.end());

69//

printf("mid\n");

70double now=0,ran=0;71

for(int i=0;i//

線段覆蓋

72 line tmp=ve[i];

73//

printf("i:%d %.3f %.3f\n",i,tmp.l,tmp.r);

74if(tmp.l>now)

75else now=max(now,tmp.r);76}

77 ran+=2*pi-now;

78 ans+=c[x].r*ran;//

累加半徑

79return;80

}81intmain()

89for(i=n;i>=1;i--)

93 printf("

%.3f\n

",ans);

94return0;

95 }

BZOJ1055 HAOI 玩具取名

某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。第一行四個整數w i n...

BZOJ 1046 HAOI 上公升序列

1046 haoi2007 上公升序列 time limit 10 sec memory limit 162 mbsubmit 5376 solved 1862 submit status discuss description 對於乙個給定的s 若有p 滿足 x1 x2 xm 且 ax1 2 出s...

bzoj2431 HAOI2009 逆序對數列

對於乙個數列,如果有ii aj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?第一行為兩個整數n,k。寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你只需輸出該數對10000求餘數...