POJ 2318 TOYS (二維叉積 二分)

2021-07-17 00:23:25 字數 1786 閱讀 2234

題意:

乙個箱子,被n個板分為n+1塊,標號為0~n已知盒子左上角和右下角的座標及每個板上下兩端的橫座標(板不會交錯,且按順序給出)然後給出玩具的座標,統計每塊空間內玩具個數(保證玩具一定落在空間內)

5 6 0 10 60 0

3 14 3

6 810 10

15 30

1 52 1

2 85 5

40 10

7 94 10 0 10 100 0

20 20

40 40

60 60

80 80

5 10

15 10

25 10

35 10

45 10

55 10

65 10

75 10

85 10

95 10

0多個樣例,第一行n m x1 y1 x2 y2表示n條線段,m個玩具,左上角和右下角座標。

下面n行是n條線段的上端點和下端點的x座標。

在下面m行是m個玩具的座標。

p2p1(向量)×p2p0>0表示p0在p1p2的左面,<0表示在右面。

#include #include #include #include #include #include #include using namespace std;

const double eps = 1e-8;

const double pi = acos(-1.0);

int sgn(double x)

struct point

point(double _x,double _y)

point operator -(const point &b)const

double operator ^(const point &b)const

double operator *(const point &b)const

void transxy(double b)

};struct line

line(point _s,point _e)

pairoperator &(const line &b)const

double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));

res.x += (e.x-s.x)*t;

res.y += (e.y-s.y)*t;

return make_pair(2,res);

} };

int main()

int ans[5555] = ;

int x, y;

for(i = 0; i < m; i++)

else l = mid;

}v1 = line[l].s - line[l].e;

v2 = tmp - line[l].e;

point v3 = line[r].s - line[r].e;

point v4 = tmp - line[r].e;

if((v1 ^ v2) > 0)

else if((v3 ^ v4) > 0)

else

} for(i = 0; i <= n; i++)

puts("");

} return 0;

}

POJ 2318 TOYS(叉積 二分)

click here 題意 有乙個矩形的盒子,中間插了n個擋板,將盒子分成n 1個區域,然後給m個點,問最後每個區域落下多少個點。點不會落到擋板上 解題思路 把矩形的右邊看成第n 1個擋板。稍加分析,得到這個特點 若點 k 在擋板 i 的左邊,那麼 k 也一定在擋板 j 的左邊 i j n 1 則對...

POJ 2318 TOYS 叉積 二分

題意 一些斜線將矩形劃分成若干個格仔,給出一些點,問每個格仔裡有多少點。對於乙個點和乙個線段,可以通過分別連線這個點與線段的兩個端點得到兩個向量 均是以那個點為起點指向兩個端點 然後作叉積得到該點位於線段在左側還是右側,叉積大於零為右側,小於零為左側。然後該題就可以利用此性質,發現點對於每個分隔線的...

叉積的性質 poj2318 TOYS

題目大意 給定乙個矩形,中間有n塊板把這個矩形分成n 1塊,從0開始編號。保證按照順序給出並且沒有相交。給定m個點,詢問每乙個塊內有多少個點。題目分析 對於每乙個點二分所有的線段,然後利用叉積的性質判斷它在這條線的左邊還是右邊,統計答案。時間複雜度o mlogn 水題一枚 我這種蒟蒻也就能做這種題了...