SCOI2015 小凸想跑步

2022-08-13 14:39:15 字數 2377 閱讀 4801

半平面交

題目要求求出讓\(\delta pp_0p_1\)在所有形成的三角形中面積最小

那麼可以考慮對於點\(p(x , y) , p_ , p_\)

一定有$ (x - x_1 , y - y_1) \times (x_0 - x_1 , y_0 - y_1) < (x_ - x_i , y_ - y_i) \times (x - x_i , y - y_i)\(

那麼把式子化開就可以得到若干\)ax + by + c > 0\(這樣的不等式

\)(y_1 + y_i - y_0 - y_)x + (x_0 + x_ - x_1 - x_i) + p_i \times p_ - p_0 \times p_1\ >\ 0$

然後就可以上半平面交了

注意一下線段的方向

說一下如何判斷線段的方向:

分情況討論:

如果\(b\)不為\(0\)

如果\(b>0\)那麼就讓線段的方向為從左指右

否則就讓線段的方向為從右指左

如果\(b=0\)

那麼就說明ta斜率是無限大

那就判斷如果\(a>0\),就讓線段的方向為從上指下

反之就是從下指上

#include#include#include#includeconst int m = 200005 ;

const double eps = 1e-10 ;

const double inf = 1e18 ;

using namespace std ;

inline int read()

while(c>='0'&&c<='9')

return x*w ;

}double tot , ans ;

int n , cnt , head , tail ;

inline int sgn(double x)

struct vec

} pi[m] , p[m] ;

inline vec operator + (vec a , vec b)

inline vec operator - (vec a , vec b)

inline vec operator * (vec a , double b)

inline vec operator / (vec a , double b)

struct line ;

line (vec a , vec b)

} l[m] , que[m] ;

inline double dot(vec a , vec b)

inline double cross(vec a , vec b)

inline vec gli(line a , line b)

inline bool onright(vec p , line l)

inline bool operator < (line a , line b)

inline double f(double x , double a , double b , double c)

inline void si()

while(head < tail && onright(p[tail - 1] , que[head])) -- tail ;

while(head < tail && onright(p[head] , que[tail])) ++ head ;

p[tail] = gli(que[head] , que[tail]) ;

}int main() , (vec) ) ;

else l[++cnt] = line ( (vec) , (vec) ) ;

} else if(sgn(b) > 0)

l[++cnt] = line (vec(0 , f(0 , a , b , c)) , vec(1 , f(1 , a , b , c))) ;

else

l[++cnt] = line (vec(1 , f(1 , a , b , c)) , vec(0 , f(0 , a , b , c))) ;

} si() ;

p[tail + 1] = p[head] ;

for(int i = head ; i <= tail ; i ++)

ans += cross(p[i] , p[i + 1]) ;

printf("%.4lf\n",ans / tot) ;

return 0 ;

}

SCOI2015 小凸想跑步

題目 先推一波式子,設 p x,y 那麼我們嘗試寫出點 x i,y i x y 和 p x,y 形成的三角形面積,就是用叉積寫一波 2s x i x y y x x y i y 大力拆開式子,發現 2s y y x x x i y x iy x y i 不難發現這是乙個 ax by c 的形式,肯定...

SCOI2015 小凸想跑步 解題報告

最開始以為和多邊形的重心有關,後來發現多邊形的重心沒啥好玩的性質 實際上你把面積小於的不等式列出來,發現是一次的,那麼就可以半平面交了 code include include include define vector point const int n 2e5 10 const double e...

省選專練SCOI2015小凸想跑步

終於快把scoi練完了。毒瘤題這個題難點不在半平面交,在於推導 其次精度問題 eps 和inf 取值需謹慎。大了會丟精度,小了會炸精度。接著得開long double 於是流輸出。includeusing namespace std define double long double const d...