POJ 2318 TOYS 計算幾何(叉積的用法)

2022-05-23 16:12:12 字數 1461 閱讀 8624

題意:乙個矩形的玩具盒子,用隔板分成很多塊,每個隔板的兩端分別在矩形的上下邊界上,且任兩個隔板不會相交。現給定矩形的左上角和右下角座標,每個隔板兩端點的座標以及一些玩具的座標,問每個區域內分布有多少玩具?

輸入多個樣例,每個樣例輸入6個整數,n,m,x1,y1,x2,y2,n是隔板數,m是玩具個數(x1,y1),(x2,y2)分別是矩形的左上角和右下角座標,接下來n行,每行輸入兩個數ui和li,代表第i個隔板的上下端點分別是(ui,y1)和(li,y2)。隔板按照從左到右的順序給出,並且任意兩隔板不會相交。

接下來m行給出玩具座標,玩具不會恰好落在隔板上或者矩形邊界上。輸入0表示輸入結束。

輸出每個小塊中分布的玩具數目。

思路:對於乙個已知位置的玩具,可以二分找出它右邊的隔板,需要判斷線與點的位置關係,通過向量叉積判斷即可。

ps:判斷點與直線位置關係

i=ab×bc,當i為正時,點c在ab向量所在直線的左側;為負時,在右側,i=0時,點c在直線ab上。

**:

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 5010

;const

int inf = 0x7f7f7f7f

;typedef

long

long

ll;struct

point

point(

int _x, int

_y) :x(_x), y(_y) {}

point

operator -(const point& a) const

intoperator *(const point& a) const

};int

n, m, x1, y11, x2, y2;

intu[maxn], l[maxn];

intans[maxn];

bool ch(int x, int y, int

id)int find(int x, int

y)

return l - 1;}

intmain()

for (int i = 0; i <= n; i++) printf("

%d: %d\n

", i, ans[i]);

printf("\n

");}

system(

"pause");

return0;

}

POJ 2318 TOYS(計算幾何)

description 乙個矩形區域中有n條互不相交的線段,每條線段的上下端點分別在矩形的上下邊上,現給出該矩形區域中m個點的座標,保證點不在邊上,統計由這n條邊將矩形分成的n 1個區域中各有多少個點 input 多組用例,每組用例第一行六個整數n,m,xl,yl,xr,yr分別表示邊數,點數,矩形...

POJ 2318 TOYS 計算幾何

點我看題 題意 用n個分隔板把乙個矩形分成n 1個部分,然後有m個點分布在這個矩形上,問每個區域上能有多少個點。分析 利用叉乘和二分解題。首先預處理出這些分隔板,然後對每個點進行二分,二分條件是看當前要判斷的點在隔板的左還是右,而利用叉乘正好可以判斷點在左還是右邊。include include i...

poj2318 TOYS(計算幾何)

那些年不想寫的計算幾何,總有一天要還。直接列舉點,列舉四邊形即可,只要用叉乘判斷點是否在兩條線段中間即可。o n m o nm o nm include include include include include using namespace std define ll long long d...