1199: [HNOI2005]汤姆的游戏 - BZOJ
Description
汤姆是个好动的孩子,今天他突然对圆规和直尺来了兴趣。于是他开始在一张很大很大的白纸上画很多很多的矩形和圆。画着画着,一不小心将他的爆米花弄撒了,于是白纸上就多了好多好多的爆米花。汤姆发现爆米花在白纸上看起来就像一个个点,有些点落在矩形或圆内部,而有些则在外面。于是汤姆开始数每个点在多少个矩形或圆内部。毕竟汤姆还只是个孩子,而且点、矩形和圆又非常多。所以汤姆数了好一会都数不清,于是就向聪明的你求助了。你的任务是:在给定平面上N个图形(矩形或圆)以及M个点后,请你求出每个点在多少个矩形或圆内部(这里假设矩形的边都平行于坐标轴)。
Input
第一行为两个正整数N和M,其中N表示有多少个图形(矩形或圆),M表示有多少个点。接下来的N行是对每个图形的描述,具体来说,第i+1行表示第i个图形。先是一个字母,若该字母为“r”,则表示该图形是一个矩形,这时后面将有4个实数x1,y1,x2,y2,表示该矩形的一对对角顶点的坐标分别为(x1,y1)和(x2,y2);若该字母为“c”,则表示该图形是一个圆,这时后面将有3个实数x,y,r,表示该圆以(x,y)为圆心并以r为半径。最后M行是对每个点的描述,其中每行将有两个实数x,y,表示一个坐标为(x,y)的点。
Output
包含M行,每行是一个整数,其中第i行的整数表示第i个点在多少个图形内部(当某点在一个图形的边界上时,我们认为该点不在这个图形的内部)。
Sample Input
3 4
r 1.015 0.750 5.000 4.000
c 6.000 5.000 2.020
r 6.500 7.200 7.800 9.200
3.500 2.500
4.995 3.990
2.300 8.150
6.900 8.000
Sample Output
1
2
0
1
好吧,写了很久,最后发现数组越界了(第20组n是20万,第18组就是25万,我只看了第20组数据.....谁叫他题目不写清楚,只能自己下数据了)
看了网上的C++程序,知道做法了
先将点按x坐标排序,再二分出有效区间即x坐标在矩形两个横坐标之间,或者在(x-r,x+r)之间的点,然后暴力是否被覆盖,统计答案
因为最开始那个问题,我还到处问人,去贴吧问,最后在我写完C++程序(照着网上的代码写)的时候发现n最大有25万,顿时崩溃了,改完就过了
const
eps=1e-7;
type
extended=double;
var
cx,cr,cy:array[..]of extended;
lx,ly,rx,ry:array[..]of extended;
ans,k:array[..]of longint;
x,y:array[..]of extended;
n,m,numr,numc:longint; procedure swap(var x,y:extended);
var
t:extended;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint);
var
i,j,t:longint;
z:extended;
begin
i:=l;
j:=r;
z:=x[(l+r)>>];
repeat
while z>x[i]+eps do
inc(i);
while x[j]>z+eps do
dec(j);
if i<=j then
begin
swap(x[i],x[j]);
swap(y[i],y[j]);
t:=k[i];k[i]:=k[j];k[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end; procedure init;
var
i:longint;
s:char;
begin
read(n,m);
for i:= to n do
begin
read(s);
while (s<>'r')and(s<>'c') do
read(s);
if s='r' then
begin
inc(numr);
read(lx[numr],ly[numr],rx[numr],ry[numr]);
if lx[numr]>rx[numr] then swap(lx[numr],rx[numr]);
if ly[numr]>ry[numr] then swap(ly[numr],ry[numr]);
end
else
begin
inc(numc);
read(cx[numc],cy[numc],cr[numc]);
end;
end;
for i:= to m do
read(x[i],y[i]);
for i:= to m do
k[i]:=i;
sort(,m);
end; procedure work;
var
i,j,ll,rr,left,right,mid:longint;
begin
for i:= to numc do
begin
left:=;right:=m;
while left<right do
begin
mid:=(left+right)>>;
if x[mid]>cx[i]-cr[i] then right:=mid
else left:=mid+;
end;
ll:=left;
left:=;right:=m;
while left<right do
begin
mid:=(left+right+)>>;
if cx[i]+cr[i]>x[mid] then left:=mid
else right:=mid-;
end;
rr:=right;
for j:=ll to rr do
if sqr(cr[i])-eps>sqr(x[j]-cx[i])+sqr(y[j]-cy[i]) then inc(ans[k[j]]);
end;
for i:= to numr do
begin
left:=;right:=m;
while left<right do
begin
mid:=(left+right)>>;
if x[mid]>lx[i] then right:=mid
else left:=mid+;
end;
ll:=left;
left:=;right:=m;
while left<right do
begin
mid:=(left+right+)>>;
if rx[i]>x[mid] then left:=mid
else right:=mid-;
end;
rr:=right;
for j:=ll to rr do
if (y[j]>ly[i]+eps)and(ry[i]>y[j]+eps)and(x[j]>lx[i]+eps)and(rx[i]>x[j]+eps) then inc(ans[k[j]]);
end;
for i:= to m do
writeln(ans[i]);
end; begin
init;
work;
end.
pascal代码
#include<cstdio>
#include<algorithm>
using namespace std; typedef double ld; const int maxn=;
const int maxm=;
const ld eps=1e-; int n,m,ans[maxm]; struct REC
{
ld lx,ly,rx,ry;
}rec[maxn];
int numr; struct CIR
{
ld x,y,r;
}cir[maxn];
int numc; struct point
{
ld x,y;
int k;
}d[maxm]; int operator < (const point & a,const point & b)
{
return a.x<b.x;
} int main()
{
int i,j;
scanf("%d%d",&n,&m);
char s;
for(i=;i<=n;++i)
{
scanf("%s",&s);
if(s=='r')
{
++numr;
scanf("%lf%lf%lf%lf",&rec[numr].lx,&rec[numr].ly,&rec[numr].rx,&rec[numr].ry);
if(rec[numr].lx>rec[numr].rx)
swap(rec[numr].lx,rec[numr].rx);
if(rec[numr].ly>rec[numr].ry)
swap(rec[numr].ly,rec[numr].ry);
}
else
{
++numc;
scanf("%lf%lf%lf",&cir[numc].x,&cir[numc].y,&cir[numc].r);
}
}
for(i=;i<=m;++i)
{
scanf("%lf%lf",&d[i].x,&d[i].y);
d[i].k=i;
}
sort(d+,d+m+);
int left,right,ll,rr,mid;
for(i=;i<=numr;++i)
{
left=,right=m;
while(left<right)
{
mid=(left+right)/;
if(d[mid].x>rec[i].lx)right=mid;
else left=mid+;
}
ll=left;
left=;right=m;
while(left<right)
{
mid=(left+right+)/;
if(d[mid].x<rec[i].rx)left=mid;
else right=mid-;
}
rr=right;
for(j=ll;j<=rr;++j)
if((d[j].x>rec[i].lx+eps)&(rec[i].rx>d[j].x+eps)&(d[j].y>rec[i].ly+eps)&(rec[i].ry>d[j].y+eps))
++ans[d[j].k];
}
for(i=;i<=numc;++i)
{
left=;right=m;
while(left<right)
{
mid=(left+right)/;
if(d[mid].x>cir[i].x-cir[i].r)right=mid;
else left=mid+;
}
ll=left;
left=;right=m;
while(left<right)
{
mid=(left+right+)/;
if(cir[i].x+cir[i].r>d[mid].x)left=mid;
else right=mid-;
}
rr=right;
for(j=ll;j<=rr;++j)
if(cir[i].r*cir[i].r>(d[j].x-cir[i].x)*(d[j].x-cir[i].x)+(d[j].y-cir[i].y)*(d[j].y-cir[i].y))
++ans[d[j].k];
}
for(i=;i<=m;++i)
printf("%d\n",ans[i]);
return ;
}
C++代码
1199: [HNOI2005]汤姆的游戏 - BZOJ的更多相关文章
- BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力
1199: [HNOI2005]汤姆的游戏 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- 洛谷 P2313 [HNOI2005]汤姆的游戏 题解
P2313 [HNOI2005]汤姆的游戏 题目描述 汤姆是个好动的孩子,今天他突然对圆规和直尺来了兴趣.于是他开始在一张很大很大的白纸上画很多很多的矩形和圆.画着画着,一不小心将他的爆米花弄撒了,于 ...
- 几何【P2313】 [HNOI2005]汤姆的游戏
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述--->p2313 [HNOI]汤姆的游戏 分析 说不上是分析. 数据范围给出来,这题明显暴力啊emmm. 个人认为的坑点. 这题不 ...
- P2313 [HNOI2005]汤姆的游戏
题目描述 汤姆是个好动的孩子,今天他突然对圆规和直尺来了兴趣.于是他开始在一张很大很大的白纸上画很多很多的矩形和圆.画着画着,一不小心将他的爆米花弄撒了,于是白纸上就多了好多好多的爆米花.汤姆发现爆米 ...
- bzoj千题计划176:bzoj1199: [HNOI2005]汤姆的游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=1199 求出圆x的范围 把要判断的点按x从小到大排序 枚举图形 二分出x满足这个图形的一段区间 枚举这 ...
- [HNOI2005]汤姆的游戏
嘟嘟嘟 直接O(n ^ 2)暴力判断就行了. 对于圆,判断该点和圆心的距离是否小于半径. 然而为啥我这么写编译不过: scanf("%lf%lf%lf%lf", &a[++ ...
- 汤姆大叔 javascript 系列 第20课 最后的5到javascript题目
博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html 原题: 大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4 ...
- 你必须知道ASP.NET知识------关于动态注册httpmodule(对不起汤姆大叔)
一.关于动态注册的问题 很多人看过汤姆大叔的MVC之前的那点事儿系列(6):动态注册HttpModule ,其实汤姆大叔没有发现httpmodule动态注册的根本机制在哪里. 亦即:怎么动态注册?为什 ...
- 我读汤姆大叔的深入理解js(二)
继续汤姆大叔的js之旅. 揭秘命名函数表达式 函数表达式和函数声明 汤姆大叔在博客中引用ECMA规范:函数声明必须带有标识符,函数表达式可以省略.对于我来说这些概念的东西真是不所适从.还是大叔的实例带 ...
随机推荐
- button轮番点击,只点击一次,鼠标hover
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...
- ps扩大、缩小选区
用"套索工具""魔棒工具"或者等工具将选区选出来,创建出一个需要处理的选区. 点击ps菜单栏中的"选择",在下拉菜单中选择"修 ...
- Agile.Net 组件式开发平台 - 服务器端部署
应用服务器: 操作系统要求推荐Windows Server 2008,服务器硬件如果支持64位建议安装64位操作系统产品以最大化发挥服务器性能. 安装操作系统Windows Server 2008,其 ...
- SQLite的简单应用
安装部署 1)进入 SQL 下载页面:http://www.sqlite.org/download.html 2)下载预编译二进制文件包. Windows 环境的如下: 下载完之后,就算部署完成.(P ...
- WCF学习笔记 -- 基本概念
WCF是实现WebService的一种微软提出的技术,整合了.Remote, .NET及ASP.NET服务的一种框架.是Windows Communication Foundation的缩写.WebS ...
- JAVA静态和非静态内部类
JAVA静态和非静态内部类 一直对java的静态和非静态内部类的东东理解不清楚,今天测试了一下,下面把测试结果记录一下,加深印象.用于以后查找. 直接上代码. package com.test.xml ...
- [UNIX环境高级编程](第三版)中apue.h的问题
编译 gcc -g myls.c 时,报错 ‘找不到头文件 apue.h’ apue.h是作者自己写的一个文件,系统不自带.其中包含了常用的头文件,以及出错处理函数的定义. 需要到 http://ww ...
- Poj OpenJudge 百练 1860 Currency Exchang
1.Link: http://poj.org/problem?id=1860 http://bailian.openjudge.cn/practice/1860 2.Content: Currency ...
- [转]mysql-5.6.17-win32免安装版配置
1. 下载mysql-5.6.17-win32:官网下载地址百度 2. 解压到自定义目录,我这里演示的是D:\wamp\mysql\ 3. 复制根目录下的my-default.ini,改名为my.in ...
- GSM嗅探
GSM初探 大家应该都听说过HTTP协议,又听说WEB服务,每一个服务的背后都有一个协议在工作着.所谓的没有规矩不成方圆,说的就是这个道理,每一个细小的部分,都已经规定好,只要按照协议执行,就不会出现 ...