LA 4728 旋轉卡殼 Squares

2022-05-22 10:30:11 字數 1620 閱讀 5947

題意:

求平面上的最遠點對距離的平方。

分析:對於這個資料量列舉肯定是要超時的。

首先這兩個點一定是在凸包上的,所以可以列舉凸包上的點,因為凸包上的點要比原來的點會少很多,可最壞情況下的時間複雜度也是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...