BZOJ 1199 HNOI 2005 汤姆的游戏 计算几何
2015-03-02 14:12
169 查看
题目大意
给出若干个图形,这些图形中有些是矩形,剩下的是圆形。还有一些点,问每个点在多少个图形里面。思路
题目没写数据范围,其实是25w。敢O(n^2)暴力么?没错这个题就是暴力。只需用二分处理一维坐标然后第二维暴力就行了。CODE
#define _CRT_SECURE_NO_WARNINGS #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 250010 using namespace std; struct Point{ double x,y; Point(double _,double __):x(_),y(__) {} Point() {} bool operator <(const Point &a)const { return x < a.x; } void Read() { scanf("%lf%lf",&x,&y); } }; inline double Calc(const Point &a,const Point &b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) *(a.y - b.y)); } struct _Point:Point{ int id; }point[MAX]; int ans[MAX]; int graphs,points; struct Square{ Point p1,p2; void Read() { double x1,y1,x2,y2; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); p1 = Point(min(x1,x2),min(y1,y2)); p2 = Point(max(x1,x2),max(y1,y2)); } bool InRange(double y) { return y > p1.y && y < p2.y; } void Count() { int start = upper_bound(point + 1,point + points + 1,p1) - point; int end = lower_bound(point + 1,point + points + 1,p2) - point - 1; for(int i = start; i <= end; ++i) if(InRange(point[i].y)) ++ans[point[i].id]; } }square[MAX]; struct Circle{ Point p; double r; void Read() { p.Read(); scanf("%lf",&r); } bool InRange(const Point &a) { return Calc(a,p) < r; } void Count() { int start = upper_bound(point + 1,point + points + 1,Point(p.x - r,0)) - point; int end = lower_bound(point + 1,point + points + 1,Point(p.x + r,0)) - point - 1; for(int i = start; i <= end; ++i) if(InRange(point[i])) ++ans[point[i].id]; } }circle[MAX]; int squares,circles; char s[10]; int main() { cin >> graphs >> points; for(int i = 1; i <= graphs; ++i) { scanf("%s",s); if(s[0] == 'r') square[++squares].Read(); else circle[++circles].Read(); } for(int i = 1; i <= points; ++i) { point[i].Read(); point[i].id = i; } sort(point + 1,point + points + 1); for(int i = 1; i <= squares; ++i) square[i].Count(); for(int i = 1; i <= circles; ++i) circle[i].Count(); for(int i = 1; i <= points; ++i) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- BZOJ 1199 HNOI2005 汤姆的游戏 计算几何+暴力
- BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力
- 1199: [HNOI2005]汤姆的游戏 - BZOJ
- bzoj1199: [HNOI2005]汤姆的游戏
- bzoj千题计划176:bzoj1199: [HNOI2005]汤姆的游戏
- 【BZOJ1199】【HNOI2005】汤姆的游戏 特技
- BZOJ 1199: [HNOI2005]汤姆的游戏
- 几何【P2313】 [HNOI2005]汤姆的游戏
- BZOJ 1845 [Cqoi2005] 三角形面积并 计算几何扫描线
- [BZOJ 2338][HNOI 2011]数矩形(计算几何)
- bzoj 1007 : [HNOI2008]水平可见直线 计算几何
- 【BZOJ1007】【HNOI2008】水平可见直线(计算几何 凸壳)
- bzoj 1845: [Cqoi2005] 三角形面积并(计算几何)
- BZOJ_1610_[Usaco2008_Feb]_Line连线游戏_(计算几何基础+暴力)
- [扫描线 计算几何] BZOJ 1845 [Cqoi2005] 三角形面积并
- 【bzoj2338】【HNOI2011】【计算几何】【数矩形】
- 【BZOJ 1007】【HNOI 2008】水平可见直线 【计算几何】
- bzoj 1610: [Usaco2008 Feb]Line连线游戏(计算几何)
- [BZOJ 2731][HNOI 2012]三角形覆盖问题(计算几何+扫描线暴力)
- bzoj-2338 2338: [HNOI2011]数矩形(计算几何)