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 #includeview code5 #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 }
計算幾何 半平面交
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在有向直...