旋轉卡殼 最小矩形覆蓋

2021-08-15 18:05:44 字數 1465 閱讀 3798

這道題是旋轉卡殼的乙個典型問題

首先我們瞎矇乙個性質:

我們目標狀態的矩形一定有一條邊是凸包上的邊(的延長線)

其實是可以證明的:

首先,最小矩形必然每條邊上都有點

那麼如果不是凸包上的邊:

那麼我們可以通過旋轉這個矩形,使得這個矩形的某條邊上不再有點

所以,我們只需要找出凸包,暴力列舉每條邊,用旋轉卡殼來確定這個矩形。

那麼,如何卡殼呢?

很簡單,我們考慮叉積和點積的幾何意義:

叉積:可以求出乙個點與一條線所構成的三角形面積。

點積:可以求出一條向量在另一條上的投影長度。

那麼根據這兩點,我們可以通過叉積找到離當前線段最遠的點,通過點積找到離當前線段最左/右的點,通過這三個點和這條線段,我們就可以確定這個矩形了。當然,我們需要按照順時針/逆時針的順序依次列舉每條邊,然後再貪心地確定三個特殊點即可。

#include

#include

#include

#include

#include

#define sf scanf

#define pf printf

#define maxn 100010

#define eps 1e-8

using

namespace

std;

struct node

node(double xx,double yy):x(xx),y(yy) {}

node operator + (const node &a) const

node operator - (const node &a) const

node operator * (const

double &t) const

double

operator *(const node &a) const

double

operator ^(const node &a) const

/*bool operator

s.push(s1.top());

s1.push(p[i]);

}while(!s1.empty())

while(!s.empty())

s.pop();

}double len(node a)

bool cmp(node a,node b)

}}int main()

洛谷3187 最小矩形覆蓋(旋轉卡殼)

這道題瞄了眼題解才知道怎麼做的。關於為什麼最後最優矩陣有一條邊在凸包上,emmm,留坑待證。有了上面這個結論,這道題就over了,先求凸包,再旋轉卡殼找最小矩陣 左右點積,上方叉積 精度簡直被卡的想吐 0.00000是什麼?蛤?有毒吧?include include include includec...

HNOI2007 最小矩形覆蓋 旋轉卡殼

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

《模板》《計算幾何》凸包 旋轉卡殼最小面積外接矩形

今天做uva 10173時遇到的問題,網上各位大牛的 和思想實在無法理解,請教學長後理解了乙個演算法。學長 下面貼一下學長的模板,圖和注釋是我加上的。注 淺褐色為凸包,紅色為待求矩形。include include include include define min x,y x using nam...