這道題是旋轉卡殼的乙個典型問題
首先我們瞎矇乙個性質:
我們目標狀態的矩形一定有一條邊是凸包上的邊(的延長線)
其實是可以證明的:
首先,最小矩形必然每條邊上都有點
那麼如果不是凸包上的邊:
那麼我們可以通過旋轉這個矩形,使得這個矩形的某條邊上不再有點
所以,我們只需要找出凸包,暴力列舉每條邊,用旋轉卡殼來確定這個矩形。
那麼,如何卡殼呢?
很簡單,我們考慮叉積和點積的幾何意義:
叉積:可以求出乙個點與一條線所構成的三角形面積。
點積:可以求出一條向量在另一條上的投影長度。
那麼根據這兩點,我們可以通過叉積找到離當前線段最遠的點,通過點積找到離當前線段最左/右的點,通過這三個點和這條線段,我們就可以確定這個矩形了。當然,我們需要按照順時針/逆時針的順序依次列舉每條邊,然後再貪心地確定三個特殊點即可。
#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...