bzoj 2829 信用卡凸包 (凸包)

2021-07-27 03:15:03 字數 1478 閱讀 9857

time limit: 10 sec  

memory limit: 128 mbsec  

special judge

submit: 327  

solved: 151 [

submit][

status][

discuss]

26.0 2.0 0.0

0.0 0.0 0.0

2.0 -2.0 1.5707963268

21.66

本樣例中的2張信用卡的輪廓在上圖中用實線標出,如果視1.5707963268為

pi/2(pi為圓周率),則其凸包的周長為16+4*sqrt(2)

[submit][

status][

discuss]

題解:凸包

以圓心為點做凸包,然後求凸包的周長,最後加上乙個圓的周長。

#include#include#include#include#include#define n 100003

using namespace std;

int n,m;

double a,b,r,pi=acos(-1.0);

struct vector

}p[n],ch[n];

bool operator

int k=m;

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

m--;

}int main()

{ freopen("a.in","r",stdin);

freopen("my.out","w",stdout);

scanf("%d",&n);

scanf("%lf%lf%lf",&a,&b,&r);

int cnt=0;

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

double x,y,rad;

scanf("%lf%lf%lf",&x,&y,&rad);

double l=a-2.0*r; l/=2.0;

double d=b-2.0*r; d/=2.0; vector v;

p[0]=vector(x,y);

p[++cnt].x=x+d; p[cnt].y=y+l; v=rotate(p[cnt]-p[0],rad); p[cnt]=p[0]+v;

p[++cnt].x=x-d; p[cnt].y=y-l; v=rotate(p[cnt]-p[0],rad); p[cnt]=p[0]+v;

p[++cnt].x=x+d; p[cnt].y=y-l; v=rotate(p[cnt]-p[0],rad); p[cnt]=p[0]+v;

p[++cnt].x=x-d; p[cnt].y=y+l; v=rotate(p[cnt]-p[0],rad); p[cnt]=p[0]+v;

// for (int j=cnt;j>=cnt-4+1;j--)

// cout<

bzoj2829 信用卡凸包 凸包

26.0 2.0 0.0 0.0 0.0 0.0 2.0 2.0 1.5707963268 21.66 本樣例中的2張信用卡的輪廓在上圖中用實線標出,如果視1.5707963268為 pi 2 pi為圓周率 則其凸包的周長為16 4 sqrt 2 題解 把邊上的圓去掉然後求一遍凸包,最後再加上乙個圓...

BZOJ 2829 信用卡凸包 凸包

傳送門 bzoj2829 太zz了,這麼水的題都沒想出來。如果是矩形,凸包上的點一定都是矩形的頂點,gra ha mgraham graham 求出凸包後將每個頂點的尖角轉成圓弧,貢獻不好算。於是將矩形的頂點轉成四個1 4 frac 14 41 圓的圓心,求出凸包周長後 乙個圓的周長即可。直接貼黃學...

BZOJ2829 信用卡凸包

標籤 凸包 題目傳送門 description input output sample input 26.0 2.0 0.0 0.0 0.0 0.0 2.0 2.0 1.5707963268 sample output 21.66 hint 本樣例中的2張信用卡的輪廓在上圖中用實線標出,如果視1.5...