方師傅來到了乙個二維平面。他站在原點上,覺得這裡風景不錯,就建了乙個房子。這個房子是n個點的凸多邊形
,原點一定嚴格在凸多邊形內部。有m個人也到了這個二維平面。現在你得到了m個人的座標,你要判斷這m個人中
有多少人在房子內部。點在凸多邊形邊上或者內部都認為在房子裡面。
第一行乙個數n,接下來n行,每行兩個整數x,y。輸入按照逆時針順序輸入乙個凸包。
接下來乙個數m,最後有m行,第一行兩個整數 x,y,表示第乙個人的座標。
對於第i個詢問(i>=2) ,輸入兩個數dx,dy。
如果上乙個人在房子內部,x[i]=x[i-1]+dx,y[i]=y[i-1]+dy。否則x[i]=x[i-1]-dx,y[i]=y[i-1]-dy。
n <= 100000, m <= 200000,輸入保證所有人的座標,房屋的座標都在[-1e9,1e9]之內。
輸出乙個數,在房子內部人的個數。
4-2 -2
2 -2
2 2-2 2
35 5
4 40 3
1乙個乙個找顯然是不行的
我們把第乙個點作為基點,向其他所有點連邊,這樣就把凸多邊形變成了若干個三角形(偽三角剖分。。)
因為給出的資料是已經排好序了的,所以對於每乙個詢問,我們先二分找到當前點屬於哪乙個三角形範圍之內
之後就只要判斷點是否在三角形之內就行了
還要注意一些小細節,比如凸多邊形上1號點和n號點之間的範圍,還有精度問題
最開始我寫的是atan2的極角排序,後來怎麼調也沒過,現在還不知道是什麼原因
後來對於每一凸包上的每乙個點i,我們判斷詢問的點x是否在1點與i點連邊的「左」方,一樣可以達到效果
#include#define ll long long5008 方師傅的房子const
int maxn=100000+10,maxm=200000+10
;int
n,m,x[maxm],y[maxm],ans,pre;
struct
node;
inline node
operator - (const node &a) const;};
node point[maxn];
template
inline void read(t &x)
template
inline void write(t x,char c='\0'
)template
inline void chkmin(t &x,t y)
template
inline void chkmax(t &x,t y)
template
inline t min(t x,t y)
template
inline t max(t x,t y)
inline ll cross(node a,node b)
inline
bool check(int dx,int
dy)
if(cross(point[l]-point[l-1],q-point[l])>=0)return
true
;
else
return
false;}
intmain()
write(ans,'\n
');return0;
}
bzoj 5008 方師傅的房子
將第乙個點向其他各點連邊,那麼就有n 1條線段,組成n 2個三角形。然後二分那個點在哪個三角形內,通過差積判斷左右。最後再判斷是否在裡面,注意邊界問題。然後我發現我二分sb了,對於這種可能無解的問題,應該先特判或初值個特殊情況。code include include include include...
bzoj5008 方師傅的房子
description 方師傅來到了乙個二維平面。他站在原點上,覺得這裡風景不錯,就建了乙個房子。這個房子是n個點的凸多邊形 原點一定嚴格在凸多邊形內部。有m個人也到了這個二維平面。現在你得到了m個人的座標,你要判斷這m個人中 有多少人在房子內部。點在凸多邊形邊上或者內部都認為在房子裡面。input...
刷題 BZOJ 3252 攻略
題目簡述 樹版 k取方格數 眾所周知,桂木桂馬是攻略之神,開啟攻略之神模式後,他可以同時攻略k部遊戲。今天他得到了一款新遊戲 xx 半島 這款遊戲有n個場景 scene 某些場景可以通過不同的選擇支到達其他場景。所有場景和選擇支構成樹狀 結構 開始遊戲時在根節點 共通線 葉子節點為結局。每個場景有乙...