刷題 BZOJ 5008 方師傅的房子

2022-05-27 06:21:10 字數 1685 閱讀 9930

方師傅來到了乙個二維平面。他站在原點上,覺得這裡風景不錯,就建了乙個房子。這個房子是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 long

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;

}

5008 方師傅的房子

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 某些場景可以通過不同的選擇支到達其他場景。所有場景和選擇支構成樹狀 結構 開始遊戲時在根節點 共通線 葉子節點為結局。每個場景有乙...