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