求紅線總長可以用每個圓的周長減去被覆蓋的部分
對每個圓i,列舉
j>
i j
>
i計算圓j覆蓋了圓i的長度
若i和j相離/相切或i包含j不考慮
若i被j包含就被完全覆蓋
否則是相交的情況如圖
圓a和圓b交與c,d,可以算出ae,ce的長度,用餘弦定理可以算得coscae,用acos,atan2可以算得a被覆蓋的乙個弧度區間,把所有覆蓋的區間求出來後就變成了乙個區間覆蓋問題
code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using
namespace
std;
const
int maxn = 1100;
const
double pi = acos(-1);
const
double eps = 1e-9;
const
double sqr(const
double x)
int n;
struct node
a[maxn];
struct interval
double dec=acos((sqr(a[i].r)+sqr(dis)-sqr(a[j].r))/(2.0*a[i].r*dis));
double mid=atan2(a[j].y-a[i].y,a[j].x-a[i].x);
double l=mid-dec,r=mid+dec;
if(r>pi) t[++tp]=(interval),r=pi;
if(l
t[++tp]=(interval);
}if(!fl) continue;
sort(t+1,t+tp+1);
double las=-pi,sum=0;
for(int j=1;j<=tp;j++)
BZOJ1043 HAOI2008 下落的圓盤
每個圓盤只會受到後邊的圓盤的影響 所以算一下每個圓盤和後邊的圓盤相交的圓心角,然後求個並即可 可以用餘弦定理 複雜度n 2 log n 注意特判沒有交 include include include include include include include include include in...
bzoj1043 HAOI2008 下落的圓盤
題目鏈結 有n個圓盤從天而降,後面落下的可以蓋住前面的。求最後形成的封閉區域的周長。直接模擬,求出當前圓盤與之前的所有的圓盤的交點,用極角表示,模擬結束後求出每個圓盤未被覆蓋的角度即可。include include include include include include using nam...
HAOI2008 bzoj1043 下落的圓盤
description 有n個圓盤從天而降,後面落下的可以蓋住前面的。求最後形成的封閉區域的周長。看下面這副圖,所有的紅 色線條的總長度即為所求.input 第一行為1個整數n,n 1000 接下來n行每行3個實數,ri,xi,yi,表示下落時第i個圓盤的半徑和圓心座標.output 最後的周長,保...