POJ 2318 TOYS (矩形内判断点与线段关系,水)
2014-04-07 21:06
399 查看
第一道计算几何的题,非常水。。
感觉计算几何的题里会用到各种结构体。。
感觉计算几何的题里会用到各种结构体。。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef struct Point { int x, y; }Point; typedef struct Segment { Point a, b; }Segment; typedef struct Vector { int x, y; }Vector; const int maxn = 5050; Segment seg[maxn]; int scnt, pcnt[maxn]; int n, m, x1, y1, x2, y2; void addSeg(int x1, int y1, int x2, int y2) { Segment &cur = seg[scnt]; cur.a.x = x1; cur.a.y = y1; cur.b.x = x2; cur.b.y = y2; scnt++; } int product(Vector s1, Vector s2) { return s1.x * s2.y - s1.y * s2.x; } int check(int x, int y, int num) { Segment &cur = seg[num]; int x1 = cur.a.x, x2 = cur.b.x, y1 = cur.a.y, y2 = cur.b.y; Vector v1, v2; v1.x = x1 - x2; v1.y = y1 - y2; v2.x = x - x2; v2.y = y - y2; return product(v2, v1); } void addToy(int x, int y) { if(x < x1 || x > x2 || y > y1 || y < y2) return; int low = 0, high = scnt-1; while(low < high) { int mid = (low + high) / 2; if(check(x, y, mid) > 0) { if(check(x, y, mid+1) < 0) { pcnt[mid]++; return; } else low = mid + 1; } else{ if(check(x, y, mid-1) > 0) { pcnt[mid-1]++; return; } else high = mid - 1; } } } int main() { bool first = true; while(~scanf("%d%d%d%d%d%d", &n, &m, &x1, &y1, &x2, &y2) && n) { if(first) first = false; else printf("\n"); scnt = 0; addSeg(x1, y1, x1, y2); memset(pcnt, 0, sizeof(pcnt)); for(int i = 0; i < n; i++) { int p, q; scanf("%d%d", &p, &q); addSeg(p, y1, q, y2); } addSeg(x2, y1, x2, y2); for(int i = 0; i < m; i++) { int x, y; scanf("%d%d", &x, &y); addToy(x, y); } for(int i = 0; i <= n; i++) printf("%d: %d\n", i, pcnt[i]); } return 0; }
相关文章推荐
- HDOJ-4311 Meeting point-1
- 链表线性表
- java验证卡布列克常数
- opencv入门Vec3f
- C/C++混合编程--extern “C” 使用方法详解
- java设计模式之迭代器模式iterator
- 动态规划——01背包问题
- Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
- Pat(Advanced Level)Practice--1048(Find Coins)
- 函数调用
- 树状数组优化 之 uva299
- 《算法导论》笔记 第7章 7.1快速排序的描述
- 记录我的英语道路
- 记录我的英语道路
- 《算法导论》笔记 第7章 7.1快速排序的描述
- 树状数组优化 之 uva299
- vmware虚拟机拿不到IP的解决方法
- 堆排序
- linux中rmdir命令使用详解(删除空目录)
- linux内核线程的创建与销毁