HNOI2007 最小矩形覆蓋 旋轉卡殼

2022-09-10 00:12:35 字數 1690 閱讀 1013

旋轉卡殼,orz orz orz

給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標輸入格式:第一行為乙個整數n(3<=n<=50000),從第2至第n+1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法輸出格式:第一行為乙個浮點數,表示所求矩形的面積(精確到小數點後5位),接下來4行每行表示乙個頂點座標,要求第一行為y座標最小的頂點,其後按逆時針輸出頂點座標.如果用相同y座標,先輸出最小x座標的頂點輸入樣例#1:複製

6 1.0 3.00000

1 4.00000

2.0000 1

3 0.0000

3.00000 6

6.0 3.0

輸出樣例#1:複製

18.00000

3.00000 0.00000

6.00000 3.00000

3.00000 6.00000

0.00000 3.00000

感謝 @intruder 提供題目簡述

由於某個神奇的結論,一定會有一條邊在凸殼上,列舉每條凸殼上的邊。那麼對於這條邊的對面有乙個對鐘點(即高最大,叉積最大),由於顯然位置單調,利用叉積卡殼單調列舉即可,類似的可以利用點積最小和最大的點可以找出最左點和最右點,這樣就保證可以覆蓋所有點,然後略用一點初中幾何知識,就可以了。

極度卡精度orz

#include#include#include#includeusing namespace std;

typedef double db;

const int maxn = 5e5+5;

const db eps = 1e-8;

struct node

friend node operator*(node aa,db bb) ;

}friend db operator^(node aa,node bb)

friend node operator+(node aa,node bb) ;

}friend node operator-(node aa,node bb) ;

}friend db dis(node aa)

friend db chaji(node aa,node bb,node cc)

friend db diji(node aa,node bb,node cc)

friend bool cp(node aa,node bb)

}z[maxn],s[maxn],as[10]; int tp; db ans=1e18;;

bool cmp(node aa,node bb)

int n;

void gethull()

int tmp = tp;

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

--tp;

s[tp+1] = s[1];

}void kaker()

}}int main()

gethull();

kaker();

printf("%.5f\n",ans);

int fi = 1;

for(int i=2;i<=4;i++)

for(int i=fi;i<=4;i++)

for(int i=1;i}

HNOI2007 最小矩形覆蓋

給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標 輸入格式 第一行為乙個整數n 3 n 50000 從第2至第n 1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法 輸出格式 第一行為乙個浮點數,表示所求矩形的面積 精確到小數點後5位 接下來4行每...

HNOI2007 最小矩形覆蓋

給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標 第一行為乙個整數n 3 n 50000 從第2至第n 1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法 第一行為乙個浮點數,表示所求矩形的面積 精確到小數點後5位 接下來4行每行表示乙個頂點座標,...

HNOI2007 最小矩形覆蓋

嘟嘟嘟 這道題我從昨天晚上5點做到今天下午3點半 差點就瘋了。真是一道計算幾何好題呀!剛開始我以為矩形與座標軸平行,感覺省選題竟然這麼水。但是看完樣例後發現我錯了 首先都知道要求凸包。寫 的時候一定要非常謹慎。對於重合或共線的點都要從棧中彈去,否則在後面的求矩形面積的時候會除以 0 然後就會想我一樣...