計算幾何 半平面交

2022-05-28 21:03:16 字數 2651 閱讀 8486

la 4992 && hdu 3761 jungle outpost

杭電的有點坑啊。。一直爆記憶體,後來發現大白的半平面交模板那裡 point *p = new point[n]; line *q = new line[n]這裡出了問題,應該是在函式裡面申請不了比較大的陣列,所以爆記憶體。。我在全域性定義了兩個陣列就不會爆了。。

本來跑了17s多的,後來半平面交sort( l, l + n ) 被我注釋了,就跑了9s多,la上跑了 2s。。應該是輸入資料比較好,不用按照極角排序。。然後就是照著大白的想法,二分答案,用半平面交判斷是否滿足條件。。

輸入是按照逆時針輸入的,所以用p[i] - p[(i+m+1)%n]表示直線的向量。。

這道題被坑了好久,好傷心。。貼的是在杭電ac的**

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include8 #include9

10using

namespace

std;

1112

#define mnx 50050

13#define ll long long

14#define mod 1000000007

15#define inf 0x3f3f3f3f

16#define eps 1e-8

17#define pi acos(-1.0);

18#define lson l, m, rt << 1

19#define rson m+1, r, rt << 1 | 1

2021

int dcmp( double

x )25

struct

point

28 point operator + ( const point &b ) const

31 point operator - ( const point &b ) const

34 point operator * ( const

double &k ) const

37 point operator / ( const

double &k ) const

40bool

operator

< ( const point &b ) const

43bool

operator == ( const point &b ) const

46double

len()

49};

50typedef point vector;

51struct

line

56line( point p, point v ) : p(p), v(v)

59bool

operator

< ( const line &b ) const

62};

63double

dot( vector a, vector b )

66double

cross( vector a, vector b )

69bool

onleft( line l, point p )

72point getintersection( line a, line b )

77point pp[mnx];

78line q[mnx];

79int halfplaneintersection( line *l, int n, point *poly )

91if( first < last ) pp[last-1] = getintersection( q[last-1

], q[last] );92}

93while( first < last && !onleft( q[first], pp[last-1] ) ) last--;

94if( last - first <= 1 ) return0;

95 pp[last] =getintersection( q[last], q[first] );

96int m = 0;97

for( int i = first; i <= last; i++)

100return

m;101

}102

point p[mnx], poly[mnx];

103line l[mnx];

104bool check( int n, int

m )109

int all =halfplaneintersection( l, n, poly );

110if( !all ) return1;

111else

return0;

112}

113int

main()

121if( n > 50000 ) continue

;122

int l = 0, r =n, ans;

123while( l

128else l = m + 1

;129

}130 printf( "

%d\n

", ans );

131}

132return0;

133 }

view code

計算幾何 半平面交

step1.將所有半平面按極角排序,對於極角相同的,選擇性的保留乙個。o nlogn step2.使用乙個雙端佇列 deque 加入最開始2個半平面。step3.每次考慮乙個新的半平面 a.while deque頂端的兩個半平面的交點在當前半平面外 刪除deque頂端的半平面 b.while deq...

計算幾何 半平面交

平面內的一條直線把這個平面分成兩部分,每一部分對這個平面來說,都叫做半平面。包括這條直線的半平面叫做閉半平面,否則叫做開半平面。解析式為 ax by c 0 或 ax by c 0 在計算幾何中用向量表示,整個題統一以向量的左側或右側為半平面。半平面交就是多個半平面的交集。半平面交是乙個點集。它可以...

半平面交模板

妹的,一直沒有想清楚無解的情況到底是如何判斷的。偷來乙個模板。半平面交的結果 1.凸多邊形 後面會講解到 2.無界,因為有可能若干半平面沒有形成封閉3.直線,線段,點,空 屬於特殊情況吧 演算法 1 根據上圖可以知道,運用給出的多邊形每相鄰兩點形成一條直線來切割原有多邊形,如果多邊形上的點i在有向直...