题解 P2313 【[HNOI2005]汤姆的游戏】

顾z

2018-09-29 14:39:19

Solution

# [顾](https://www.luogu.org/blog/RPdreamer/#)[z](https://www.cnblogs.com/-guz/) ~~你没有发现两个字里的blog都不一样嘛~~ qwq 题目描述--->[p2313 [HNOI]汤姆的游戏](https://www.luogu.org/problemnew/show/P2313) ## 分析 ~~说不上是分析~~. 数据范围给出来,这题明显暴力啊emmm。 ### 个人认为的坑点. 这题不要判精度,判精度会挂掉. 输入点之后,直接暴力枚举图形去判断其是否在这个图形中。 本来以为长方形给的都是 左上角和右下角. 结果**这题给的是右上角和左下角**. 搞得我取了半天$max,min$. (代码自己看着都有点恶心. (还是我没有看清题的说 emmm. 注意计算**点到圆心的距离的公式**是 $\sqrt{(x_i-x_j) \times (x_i-x_j) +(y_i-y_j)\times (y_i-y_j))}$ ------------------代码------------------- ```cpp #include<cstdio> #include<iostream> #include<cmath> #define R register using namespace std; int n,m; struct cod { char shape; double a,b,c,d,r; }s[508]; int main() { scanf("%d%d",&n,&m); for(R int i=1;i<=n;i++) { cin>>s[i].shape; switch(s[i].shape) { case 'r': { scanf("%lf%lf%lf%lf",&s[i].a,&s[i].b,&s[i].c,&s[i].d); break; } case 'c': { scanf("%lf%lf%lf",&s[i].a,&s[i].b,&s[i].r); break; } } } for(R int i=1;i<=m;i++) { R double x,y;R int cnt=0; scanf("%lf%lf",&x,&y); for(R int j=1;j<=n;j++) { if(s[j].shape=='c') { double dis=sqrt((s[j].a-x)*(s[j].a-x)+(s[j].b-y)*(s[j].b-y)); if(dis<s[j].r) cnt++; } else { if(x==s[j].a or x==s[j].c)continue; if(y==s[j].b or y==s[j].d)continue; if(x>min(s[j].a,s[j].c) and x<max(s[j].c,s[j].a)and y<max(s[j].b,s[j].d) and y>min(s[j].d,s[j].b)) cnt++; } } printf("%d\n",cnt); } } ```