description
方師傅來到了乙個二維平面。他站在原點上,覺得這裡風景不錯,就建了乙個房子。這個房子是n個點的凸多邊形
,原點一定嚴格在凸多邊形內部。有m個人也到了這個二維平面。現在你得到了m個人的座標,你要判斷這m個人中
有多少人在房子內部。點在凸多邊形邊上或者內部都認為在房子裡面。
input
第一行乙個數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]之內。
output
輸出乙個數,在房子內部人的個數。
sample input
-2 -2
2 -2
2 2-2 2
5 54 4
0 3sample output
o(logn)判斷乙個點是否在凸包內的方法:從第乙個點向其他點連線,把這個凸包分成n?2個三角形,然後二分,用叉積判斷當前點是否在三角形內。總時間複雜度o(mlogn)。
code:
#include
#include
#include
#include
using namespace std;
const int n=200005;
int n,m;
struct nodep1[n],p2[n];
int ans=0,now=1;
double mul (node a,node b,node c)
int main()
int l=2,r=n;//我們要分的三角形
while (l<=r)
if (mul(p1[l],p1[l-1],p2[u])<0) now=1,ans++;
else now=-1;
}printf("%d\n",ans);
return 0;
}
bzoj 5008 方師傅的房子
將第乙個點向其他各點連邊,那麼就有n 1條線段,組成n 2個三角形。然後二分那個點在哪個三角形內,通過差積判斷左右。最後再判斷是否在裡面,注意邊界問題。然後我發現我二分sb了,對於這種可能無解的問題,應該先特判或初值個特殊情況。code include include include include...
刷題 BZOJ 5008 方師傅的房子
方師傅來到了乙個二維平面。他站在原點上,覺得這裡風景不錯,就建了乙個房子。這個房子是n個點的凸多邊形 原點一定嚴格在凸多邊形內部。有m個人也到了這個二維平面。現在你得到了m個人的座標,你要判斷這m個人中 有多少人在房子內部。點在凸多邊形邊上或者內部都認為在房子裡面。第一行乙個數n,接下來n行,每行兩...
bzoj3595 方伯伯的oj
有 n 個數,一開始是 1 n 有 m 次操作 1.把編號為 x 的人編號改為 y 保證 y 沒出現過 2.把編號為 x 的人提到第一名 3.把編號為 x 的人懟到最後一名 4.查詢排名為 x 的人的編號 初始每個人的排名 他的編號 sol 考慮線段樹,在葉子維護乙個值 v 表示這個點上的編號是多少...