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万,顿时崩溃了,改完就过了

 

  1 const
  2     eps=1e-7;
  3 type
  4     extended=double;
  5 var
  6     cx,cr,cy:array[0..250010]of extended;
  7     lx,ly,rx,ry:array[0..250010]of extended;
  8     ans,k:array[0..100010]of longint;
  9     x,y:array[0..100010]of extended;
 10     n,m,numr,numc:longint;
 11  
 12 procedure swap(var x,y:extended);
 13 var
 14     t:extended;
 15 begin
 16     t:=x;x:=y;y:=t;
 17 end;
 18  
 19 procedure sort(l,r:longint);
 20 var
 21     i,j,t:longint;
 22     z:extended;
 23 begin
 24     i:=l;
 25     j:=r;
 26     z:=x[(l+r)>>1];
 27     repeat
 28       while z>x[i]+eps do
 29         inc(i);
 30       while x[j]>z+eps do
 31         dec(j);
 32       if i<=j then
 33       begin
 34         swap(x[i],x[j]);
 35         swap(y[i],y[j]);
 36         t:=k[i];k[i]:=k[j];k[j]:=t;
 37         inc(i);
 38         dec(j);
 39       end;
 40     until i>j;
 41     if i<r then sort(i,r);
 42     if j>l then sort(l,j);
 43 end;
 44  
 45 procedure init;
 46 var
 47     i:longint;
 48     s:char;
 49 begin
 50     read(n,m);
 51     for i:=1 to n do
 52       begin
 53         read(s);
 54         while (s<>'r')and(s<>'c') do
 55           read(s);
 56         if s='r' then
 57           begin
 58             inc(numr);
 59             read(lx[numr],ly[numr],rx[numr],ry[numr]);
 60             if lx[numr]>rx[numr] then swap(lx[numr],rx[numr]);
 61             if ly[numr]>ry[numr] then swap(ly[numr],ry[numr]);
 62           end
 63         else
 64           begin
 65             inc(numc);
 66             read(cx[numc],cy[numc],cr[numc]);
 67           end;
 68       end;
 69     for i:=1 to m do
 70       read(x[i],y[i]);
 71     for i:=1 to m do
 72       k[i]:=i;
 73     sort(1,m);
 74 end;
 75  
 76 procedure work;
 77 var
 78     i,j,ll,rr,left,right,mid:longint;
 79 begin
 80     for i:=1 to numc do
 81       begin
 82         left:=1;right:=m;
 83         while left<right do
 84           begin
 85             mid:=(left+right)>>1;
 86             if x[mid]>cx[i]-cr[i] then right:=mid
 87             else left:=mid+1;
 88           end;
 89         ll:=left;
 90         left:=1;right:=m;
 91         while left<right do
 92           begin
 93             mid:=(left+right+1)>>1;
 94             if cx[i]+cr[i]>x[mid] then left:=mid
 95             else right:=mid-1;
 96           end;
 97         rr:=right;
 98         for j:=ll to rr do
 99           if sqr(cr[i])-eps>sqr(x[j]-cx[i])+sqr(y[j]-cy[i]) then inc(ans[k[j]]);
100       end;
101     for i:=1 to numr do
102       begin
103         left:=1;right:=m;
104         while left<right do
105           begin
106             mid:=(left+right)>>1;
107             if x[mid]>lx[i] then right:=mid
108             else left:=mid+1;
109           end;
110         ll:=left;
111         left:=1;right:=m;
112         while left<right do
113           begin
114             mid:=(left+right+1)>>1;
115             if rx[i]>x[mid] then left:=mid
116             else right:=mid-1;
117           end;
118         rr:=right;
119         for j:=ll to rr do
120           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]]);
121       end;
122     for i:=1 to m do
123       writeln(ans[i]);
124 end;
125  
126 begin
127     init;
128     work;
129 end.
pascal代码

 

  1 #include<cstdio>
  2 #include<algorithm>
  3 using namespace std;
  4 
  5 typedef double ld;
  6 
  7 const int maxn=250010;
  8 const int maxm=10010;
  9 const ld eps=1e-7;
 10 
 11 int n,m,ans[maxm];
 12 
 13 struct REC
 14 {
 15     ld lx,ly,rx,ry;
 16 }rec[maxn];
 17 int numr;
 18 
 19 struct CIR
 20 {
 21     ld x,y,r;
 22 }cir[maxn];
 23 int numc;
 24 
 25 struct point
 26 {
 27     ld x,y;
 28     int k;
 29 }d[maxm];
 30 
 31 int operator < (const point & a,const point & b)
 32 {
 33     return a.x<b.x;
 34 }
 35 
 36 int main()
 37 {
 38     int i,j;
 39     scanf("%d%d",&n,&m);
 40     char s;
 41     for(i=1;i<=n;++i)
 42     {
 43         scanf("%s",&s);
 44         if(s=='r')
 45         {
 46             ++numr;
 47             scanf("%lf%lf%lf%lf",&rec[numr].lx,&rec[numr].ly,&rec[numr].rx,&rec[numr].ry);
 48             if(rec[numr].lx>rec[numr].rx)
 49                 swap(rec[numr].lx,rec[numr].rx);
 50             if(rec[numr].ly>rec[numr].ry)
 51                 swap(rec[numr].ly,rec[numr].ry);
 52         }
 53         else
 54         {
 55             ++numc;
 56             scanf("%lf%lf%lf",&cir[numc].x,&cir[numc].y,&cir[numc].r);
 57         }
 58     }
 59     for(i=1;i<=m;++i)
 60     {
 61         scanf("%lf%lf",&d[i].x,&d[i].y);
 62         d[i].k=i;
 63     }
 64     sort(d+1,d+m+1);
 65     int left,right,ll,rr,mid;
 66     for(i=1;i<=numr;++i)
 67     {
 68         left=1,right=m;
 69         while(left<right)
 70         {
 71             mid=(left+right)/2;
 72             if(d[mid].x>rec[i].lx)right=mid;
 73             else left=mid+1;
 74         }
 75         ll=left;
 76         left=1;right=m;
 77         while(left<right)
 78         {
 79             mid=(left+right+1)/2;
 80             if(d[mid].x<rec[i].rx)left=mid;
 81             else right=mid-1;
 82         }
 83         rr=right;
 84         for(j=ll;j<=rr;++j)
 85             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))
 86             ++ans[d[j].k];
 87     }
 88     for(i=1;i<=numc;++i)
 89     {
 90         left=1;right=m;
 91         while(left<right)
 92         {
 93             mid=(left+right)/2;
 94             if(d[mid].x>cir[i].x-cir[i].r)right=mid;
 95             else left=mid+1;
 96         }
 97         ll=left;
 98         left=1;right=m;
 99         while(left<right)
100         {
101             mid=(left+right+1)/2;
102             if(cir[i].x+cir[i].r>d[mid].x)left=mid;
103             else right=mid-1;
104         }
105         rr=right;
106         for(j=ll;j<=rr;++j)
107             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))
108             ++ans[d[j].k];
109     }
110     for(i=1;i<=m;++i)
111         printf("%d\n",ans[i]);
112     return 0;
113 }
C++代码

 

转载于:https://www.cnblogs.com/Randolph87/p/3594524.html

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值