第一道計算幾何題。。
題意:在乙個長方形盒子中被線段劃分成了幾段區域,然後每段區域中都有一些物品,讓你判斷在每個區域中分別有幾個物品。
叉積的簡單應用:
這就要用到向量叉積。叉積的乙個非常重要的性質是通過它的符號判斷兩向量相互之間的順逆時針關係:設向量p=(x1,y1),q=(x2,y2)
如果p*q>0則p在q的順時針方向;
如果p*q=0則p與q共線,可能同向,與可能反向;
如果p*q<0則p在q的逆時針方向。
(請注意這裡是叉乘)
這裡要注意一點就是我們在做叉積的時候,要先選擇好是按照下面還是按照上面部分作為起始點。也就是在算向量時的起始點。要不然的話會使叉積的順時針或是逆時針不同,這樣就會使答案不一樣了。
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef __int64 ll;
typedef unsigned __int64 ull;
#define pi acos(-1.0)
#define ex exp(1.0)
#define maxn 5050*2
int vis[5050];
struct nodea[maxn],b[maxn];
struct point
};typedef point vector;
vector operator - (point a,point b)
vector operator * (point a,double p)
int cross(vector a,vector b)
int main()
for(int i=1;i<=m;i++)
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
vector d,e,f;
d.x=a[i+1].x;
d.y=a[i+1].y;
e.x=a[(i+1)+5000].x;
e.y=a[(i+1)+5000].y;
f.x=b[j].x;
f.y=b[j].y;
f=f-d;
d=e-d;
if(cross(f,d)<0)
}else if(cross(c,a)<=0)
vector d,e,f;
d.x=a[i-1].x;
d.y=a[i-1].y;
e.x=a[(i-1)+5000].x;
e.x=a[(i-1)+5000].y;
f.x=b[j].x;
f.y=b[j].y;
f=f-d;
d=e-d;
if(cross(f,d)>0)}}
}for(int i=0;i<=n;i++)
printf("\n");
}#ifndef online_judge
system("pause");
#endif
return 0;}/*
5 6 0 10 60 0
3 14 3
6 810 10
15 30
1 52 1
2 85 5
40 10
7 9*/
叉積的性質 poj2318 TOYS
題目大意 給定乙個矩形,中間有n塊板把這個矩形分成n 1塊,從0開始編號。保證按照順序給出並且沒有相交。給定m個點,詢問每乙個塊內有多少個點。題目分析 對於每乙個點二分所有的線段,然後利用叉積的性質判斷它在這條線的左邊還是右邊,統計答案。時間複雜度o mlogn 水題一枚 我這種蒟蒻也就能做這種題了...
POJ 2318 TOYS 向量叉積運算
題意,給出一塊方框的左上 右下角座標,然後輸入n個擋板的兩端點座標 擋板從0 n 1 標記 再輸入m個玩具丟到框內的座標。資料保證玩具丟到框裡,且擋板已經從左到右排好序。輸出落在每塊擋板前空間內的玩具個數。類似的方法以前在杭電oj遇到過,是一道計算多邊形面積題目。當時沒有學向量積運算,所以最後只是記...
POJ 2318 TOYS(叉積 二分)
click here 題意 有乙個矩形的盒子,中間插了n個擋板,將盒子分成n 1個區域,然後給m個點,問最後每個區域落下多少個點。點不會落到擋板上 解題思路 把矩形的右邊看成第n 1個擋板。稍加分析,得到這個特點 若點 k 在擋板 i 的左邊,那麼 k 也一定在擋板 j 的左邊 i j n 1 則對...