題意:
求平面上的最遠點對距離的平方。
分析:對於這個資料量列舉肯定是要超時的。
首先這兩個點一定是在凸包上的,所以可以列舉凸包上的點,因為凸包上的點要比原來的點會少很多,可最壞情況下的時間複雜度也是o(n2).
於是就有了旋轉卡殼。
可以想象有兩條平行直線緊緊地夾住這個凸包,那直線上的點就是對踵點對。對踵點對最多有四對,就是當凸包的兩邊和兩直線重合的情況。
直線的角度不斷變化,直線上的對踵點對也會發生變化,當直線旋轉過180°後,那麼凸包上所有的對踵點對也就全部遍歷到了。
**中還有很詳細的注釋。
裡面是利用比較△(u, u+1, v) 和 △(u, u+1, v+1)的面積大小來尋找對踵點對的。因為是凸多邊形,所以面積的比較轉化成了兩個叉積的比較,最後化簡成了乙個叉積pupu
+1×pvpv+1。
直接從化簡出來的結果來看,如果兩個向量的叉乘大於0的話,說明v正在遠離直線pupu
+1,如果小於0的話說明正在靠近直線,也很容易理解。
1**君//#define local
2 #include 3 #include 4 #include 5 #include 6 #include 7
using
namespace
std;89
struct
point
1013
};14
typedef point vector;
1516 point operator + (point a, point b)
17 point operator - (point a, point b)
18int dot(vector a, vector b)
19int cross(vector a, vector b)
2021
bool
operator
< (const point& a, const point&b)
2225
26bool
operator == (const point& a, const point&b)
2730
31int dist2(const point& a, const point&b)
32 33
34 vectorconvexhull(vector&p)
3547
int k =m;
48for(int i = n-2; i >= 0; --i)
4953
if(n > 1) m--;
54ch.resize(m);
55return
ch;56}57
58int diameter2(vector&points)59
83 v = (v+1)%n;84}
85}86return
ans;87}
8889
int main(void)90
110 printf("
%d\n
", diameter2(p));
111}
112113
return0;
114 }
LA 4728凸包演算法 旋轉卡殼的直徑
1 la 4728 2凸包演算法 旋轉卡殼的直徑 3沒有其他技巧,可作為模板運用 4注意operator 中精度的處理,不然會出錯5 6 include 7 include 8 include 9 include 10 include 11 include 12 include 13 include...
LA 1453 旋轉卡殼
include using namespace std struct point typedef point vector int cross vector a,vector b vector operator vector a,vector b vector operator point a,po...
凸包掃瞄 旋轉卡殼 UVALive 4728
題意 給n個正方形,求正方形的頂點之間的最大距離。思路 可以確定的是最遠距離的2個點一定在這些正方形的頂點的凸包上的2個點。所以先求一次凸包。求凸包上2個點的最打距離,實際就是就凸包的直徑,有成型的演算法。可以用旋轉卡殼直接求解。include include include include inc...