1/*la 4728
2凸包演算法-旋轉卡殼的直徑
3沒有其他技巧,可作為模板運用
4注意operator< 中精度的處理,不然會出錯5*/
6 #include 7 #include 8 #include
9 #include 10 #include 11 #include
12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include
20 #include 21
#define inf 0x3f3f3f3f
22#define ll long long
23#define eps 1e-7
24#define maxn 401000
25using
namespace
std;
2627
28struct
point
2932
point(ll xx,ll yy)
3337
bool
operator
<(const point& p) const
//注意:按照逆時針旋轉
3842
} p1[maxn],p2[maxn];
4344
typedef point vector;
4546
bool
operator==(point a,point b)
4751 vector operator-(point a,point b)//
表示a指向b
5255 vector operator*(vector a,double
k)56
59 vector operator+(point a,point b)//
表示a指向b
6063
double
cross(vector a,vector b)
6467
double
area2(point a,point b,point c)
6871
//p是原先點的陣列,n是個數,ch是凸包的點集
72//
精度要求高是用dcmp比較
73//
返回凸包點的個數
74int convexhull(point *p, int n, point* ch) //
求凸包75
83int k =m;
84for(int i = n-2; i >= 0; i--)
8589
if(n > 1) m--;
90return
m;91}92
//卡殼預備函式
93 ll cross( const point &o, const point &a, const point &b )
96 ll dist( const point & a, const point &b )
100//
計算凸包直徑,輸入凸包 ch,頂點個數為 n,按逆時針排列,輸出直徑的平方
101 ll rotating_calipers(point *ch,int
n)102
111return
ans;
112}
113int
t,n,cnt1,cnt2;
114int
main()
115130 cnt2=convexhull(p1,cnt1,p2);
131 cout132}
133return0;
134 }
LA 4728 旋轉卡殼 Squares
題意 求平面上的最遠點對距離的平方。分析 對於這個資料量列舉肯定是要超時的。首先這兩個點一定是在凸包上的,所以可以列舉凸包上的點,因為凸包上的點要比原來的點會少很多,可最壞情況下的時間複雜度也是o n2 於是就有了旋轉卡殼。可以想象有兩條平行直線緊緊地夾住這個凸包,那直線上的點就是對踵點對。對踵點對...
凸包掃瞄 旋轉卡殼 UVALive 4728
題意 給n個正方形,求正方形的頂點之間的最大距離。思路 可以確定的是最遠距離的2個點一定在這些正方形的頂點的凸包上的2個點。所以先求一次凸包。求凸包上2個點的最打距離,實際就是就凸包的直徑,有成型的演算法。可以用旋轉卡殼直接求解。include include include include inc...
凸包問題 旋轉卡殼
1978年,m.i.shamos在 computational ceometry 中介紹了一種尋找凸多邊形直徑的線性演算法。1.支撐線 如果一條直線l,通過凸多邊形p的乙個頂點,且多邊形在這條直線的一側,稱l是p的支撐線。2.對踵 zhong,三聲 點 如果過凸包上的兩個點可以畫一對平行直線,使凸包...