bzoj5008 方師傅的房子

2022-09-23 15:57:12 字數 1126 閱讀 9167

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 表示這個點上的編號是多少...