題目要求求出讓\(\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...