ACM练级日志:POJ 2318 叉积的简单应用
2014-08-09 22:33
127 查看
最近开始学习计(keng)算(die)几何,第一道入门题就是这道了。
本题最核心的问题,就是如何判断一个点在直线(线段)的什么位置。这一点叉积可以很容易地做到。
设直线(线段)的向量为S->E, 询问点为P, 那么我们只需要计算一下 S->P x S->E, 如果大于0,说明S->P 顺时针旋转会达到S->E, 等于0说明就在直线上,小于0说明它需要逆时针旋转才能达到S->E。
在这道题里,如果我们始终选择S是上面的点,E是下面的点的话,那么S->P如果顺时针旋转能达到S->E,说明P在这条线段左边,就满足要求了。用叉积判断的时候,大于0小于0跟你所选的向量起终点以及谁x谁都有关系,最后判出顺时针逆时针也需要自己想想是在直线的哪边……
最后是代码,第一次写,可能还比较丑陋……
本题最核心的问题,就是如何判断一个点在直线(线段)的什么位置。这一点叉积可以很容易地做到。
设直线(线段)的向量为S->E, 询问点为P, 那么我们只需要计算一下 S->P x S->E, 如果大于0,说明S->P 顺时针旋转会达到S->E, 等于0说明就在直线上,小于0说明它需要逆时针旋转才能达到S->E。
在这道题里,如果我们始终选择S是上面的点,E是下面的点的话,那么S->P如果顺时针旋转能达到S->E,说明P在这条线段左边,就满足要求了。用叉积判断的时候,大于0小于0跟你所选的向量起终点以及谁x谁都有关系,最后判出顺时针逆时针也需要自己想想是在直线的哪边……
最后是代码,第一次写,可能还比较丑陋……
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> using namespace std; typedef long long LL; struct ptype { LL x,y; ptype(){x=0; y=0;}; ptype(LL _x, LL _y) { x=_x; y=_y; } ptype operator + (ptype p) { return ptype(x+p.x , y+p.y); } ptype operator - (ptype p) { return ptype(x-p.x, y-p.y); } LL cross(ptype p) { return x * p.y - y * p.x; } }; struct segtype { ptype s,e; }; int n,m; LL box_x0, box_y0, box_x1, box_y1; segtype seg[5010]; int ans[5010]; void init() { memset(seg, 0 , sizeof(seg)); memset(ans, 0, sizeof(ans)); return; } int main() { while(true) { scanf("%d", &n); if(n==0) break; scanf("%d %I64d %I64d %I64d %I64d", &m, &box_x0, &box_y0, &box_x1, &box_y1); init(); int i; for(i=1;i<=n;i++) { LL tx1, tx2; scanf("%I64d %I64d", &tx1, &tx2); ptype s(tx1, box_y0); ptype e(tx2, box_y1); seg[i].s = s; seg[i].e = e; } for(i=1;i<=m;i++) { LL tx1, tx2; scanf("%I64d %I64d", &tx1, &tx2); ptype now(tx1, tx2); int low=1, high=n+1; while(low < high) { int mid = (high+low)/2; ptype seg_s = seg[mid].s; ptype seg_e = seg[mid].e; ptype line(seg_e - seg_s); ptype now_vec(now - seg_s); if( now_vec.cross(line) > 0) high = mid; else low = mid+1; } ans[high]++; } for(i=1;i<=n+1;i++) { printf("%d: %d\n", i-1, ans[i]); } printf("\n"); } return 0; }
相关文章推荐
- poj(2318)——TOYS(叉积的简单应用)
- ACM练级日志: POJ 1389
- ACM练级日志:POJ 2886 约瑟夫环,线段树和反素数
- ACM练级日志: POJ 1376
- ACM练级日志:POJ 3074 数独与DLX
- poj 2318 TOYS(叉积的应用)
- POJ 2398 Toy Storage(叉积的简单应用)
- ACM练级日志:可持久化线段树初级-POJ 2104
- ACM练级日志:POJ 3740 与Dancing Links
- ACM练级日志: POJ 2155、1151
- POJ 2318 toys 叉积的简单运用
- POJ 1988 Cube Stacking【并查集的简单应用 堆木块】
- poj 1611 The Suspects 初级->数据结构->简单并查集的应用
- POJ 1988 Cube Stacking【并查集的简单应用 堆木块】
- POJ 2236 Wireless Network 【并查集的简单应用 判断是否在同一连通分量】
- 【解题报告】 POJ 2318 TOYS -- 判断点在某个梯形内 叉积 + 二分
- 最短路径简单应用 畅通工程续 POJ 1874
- POJ 2752、2406、1961 KMP的next[](或p[])简单应用
- poj 3207 Ikki's Story IV - Panda's Trick(2-sat简单应用)
- POJ 2492 A Bug's Life【并查集的简单应用同类的判断】