hdu5033 最大仰望角
题意:
给你n个楼房排成一条直线,楼房可以看成是宽度为1的线段,然后给你m组询问,每组询问给你一个坐标,输出在当前坐标仰望天空的可视角度。
思路:
n比较大,O(n*m)肯定跪,其实我们可以优化掉凹形的时候,比如当前询问点为x,对于右侧,往右跑的时候,我们只跑升序的就行了,这样我们只要开一个数组记录当前点最近的右侧的上升点就行了,到达当前点的时候,如果不满足,可以直接跳到记录的那个点上去,比赛的时候没敢敲,感觉时间根本过不去,后来听说可以,我又重新敲了一下,结果AC了,感觉应该是随机数据的原因,也就是根本达不到O(n*m).还有,找小标的时候可以用二分去找,刚才写的时候脑袋一热突然就用容器去弄的,就是开了一个set和一个map,一个找值一个哈希值(不建议这样写,二分就行了,还省时间)。具体看代码。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<map>
using namespace std; typedef struct
{
double X ,Y;
}Point; typedef struct
{
double x ,h;
}NODE; NODE node[110000];
int merl[110000];
int merr[110000]; bool camp(NODE a ,NODE b)
{
return a.x < b.x;
} int main ()
{
int t ,i ,j ,n ,m ,cas = 1;
double x;
scanf("%d" ,&t);
while(t--)
{
scanf("%d" ,&n);
set<double>my_st;
map<double ,int>mark;
my_st.clear();
mark.clear();
for(i = 1 ;i <= n ;i ++)
{
scanf("%lf %lf" ,&node[i].x ,&node[i].h);
merl[i] = merr[i] = i;
}
sort(node + 1 ,node + n + 1 ,camp);
for(i = 1 ;i <= n ;i ++)
{
my_st.insert(node[i].x);
mark[node[i].x] = i;
} for(i = 1 ;i <= n ;i ++)
{
for(j = i - 1 ;j >= 1 ;j --)
{
if(node[j].h > node[i].h)
{
merl[i] = j;
break;
}
if(j == merl[j]) break;
}
} for(i = n ;i >= 1 ;i --)
{
for(j = i + 1 ;j <= n ;j ++)
{
if(node[j].h > node[i].h)
{
merr[i] = j;
break;
}
if(j == merr[j]) break;
}
}
scanf("%d" ,&m);
printf("Case #%d:\n" ,cas ++);
while(m--)
{
scanf("%lf" ,&x);
int r = mark[*my_st.lower_bound(x)];
int l = r - 1; double max = node[r].h * 1.0 / (node[r].x - x);
int idr = r;
while(merr[r] != r)
{
r = merr[r];
if(max < node[r].h * 1.0 / (node[r].x - x))
{
max = node[r].h * 1.0 / (node[r].x - x);
idr = r;
}
}
max = node[l].h * 1.0 / (x - node[l].x);
int idl = l;
while(merl[l] != l)
{
l = merl[l];
if(max < node[l].h * 1.0 / (x - node[l].x))
{
max = node[l].h * 1.0 / (x - node[l].x);
idl = l;
}
}
Point A ,B ,C;
A.X = node[idl].x ,A.Y = node[idl].h;
B.X = x ,B.Y = 0;
C.X = node[idr].x ,C.Y = node[idr].h;
double x1 = A.X - x ,y1 = A.Y;
double x2 = C.X - x ,y2 = C.Y;
double Ang = ((x1 * x2) + (y1 * y2)) / (sqrt(x1 * x1 + y1 * y1) * sqrt(x2 * x2 + y2 * y2)); Ang = acos(Ang);
printf("%.10lf\n" ,Ang * 180.0 / acos(-1.0));
}
}
return 0;
}
hdu5033 最大仰望角的更多相关文章
- Android系统Gps分析(一)【转】
本文转载自:http://blog.csdn.net/xnwyd/article/details/7198728 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1 G ...
- Java全角、半角字符的关系以及转换
如果搞明白了Java中全角字符和半角字符之间的关系,那他们之间的转换就不是个麻烦事儿.你只需要对这个关系有那么一个印象就足够了. 全角字符与半角字符的关系 通过下面的代码能看到Java中所有字符以及对 ...
- Css--深入学习之折角效果
本文是作者从别的网站和文章学习了解的知识,简单做了个笔记,想要学习更多的可以参考这里:[css进阶]伪元素的妙用--单标签之美,奇思妙想 代码: /*建立一个带圆角的矩形,并使用线性渐变将其从左到底透 ...
- C# 全角和半角转换以及判断的简单代码
在C#中判断和转换全角半角的方法 1. 判断是否为全角半角 全角占用二个字节 半角占用一个字节 用string.length 和System.text.Encoding.Default.GetByte ...
- iOS 琐碎点------切某个或某几个角的圆角
不说废话----------> 1.如果是切四个角的圆角,代码示例: self.picImage.layer.cornerRadius = 8; self.picImage.layer.mask ...
- Lasso回归算法: 坐标轴下降法与最小角回归法小结
前面的文章对线性回归做了一个小结,文章在这: 线性回归原理小结.里面对线程回归的正则化也做了一个初步的介绍.提到了线程回归的L2正则化-Ridge回归,以及线程回归的L1正则化-Lasso回归.但是对 ...
- SQL转换全角/半角函数
/****** SQL转换全角/半角函数 开始******/ CREATE FUNCTION ConvertWordAngle ( ), --要转换的字符串 @flag bit --转换标志,0转换成 ...
- Css-深入学习之弧形切角矩形
本文是作者从别的网站和文章学习了解的知识,简单做了个笔记,想要学习更多的可以参考这里:[css进阶]伪元素的妙用--单标签之美,奇思妙想 (弧形切角矩形) 代码: width: 180px; heig ...
- Css--深入学习之切角
本文是作者从别的网站和文章学习了解的知识,简单做了个笔记,想要学习更多的可以参考这里:[css进阶]伪元素的妙用--单标签之美,奇思妙想 带切角的矩形: 该图来源于(奇思妙想) Css代码: .not ...
随机推荐
- CCF(JSON查询:40分):字符串+模拟
JSON查询 201709-3 纯字符串模拟,考的就是耐心和细心.可惜这两样我都缺... #include<iostream> #include<cstdio> #includ ...
- 九. SpringCloud Stream消息驱动
1. 消息驱动概述 1.1 是什么 在实际应用中有很多消息中间件,比如现在企业里常用的有ActiveMQ.RabbitMQ.RocketMQ.Kafka等,学习所有这些消息中间件无疑需要大量时间经历成 ...
- Magicodes.IE Excel合并行数据导入教程
说明 Magicodes.IE.Excel目前已支持合并行单元格导入,如本篇教程所示. 安装包Magicodes.IE.Excel Install-Package Magicodes.IE.Excel ...
- MYSQL的replace into
replace into t(id, update_time) values(1, now()); 或 replace into t(id, update_time) select 1, now(); ...
- pandas函数高级
一.处理丢失数据 有两种丢失数据: None np.nan(NaN) 1. None None是Python自带的,其类型为python object.因此,None不能参与到任何计算中. #查看No ...
- FreeBSD 12.2 vmware 虚拟机镜像 bt 种子
安装了 KDE5 火狐浏览器 Fcitx 输入法 并进行了中文设置 替换软件源为国内可用. VirtualBox虚拟机也可以用 magnet:?xt=urn:btih:E88885631B57426 ...
- 如何强制删除一个apk
有些apk安装完后无法卸载,现在收集了一些方法,以及个人的一些手段. 1. 假设该app名为ketech,安装包名为ketech.apk. 2. 查看/data/app里面是否有名称包含ketech的 ...
- Nuxt.js vue服务端渲染
一.为什么要用Nuxt.js 原因其实不用多说,就是利用Nuxt.js的服务端渲染能力来解决Vue项目的SEO问题. 二.Nuxt.js和纯Vue项目的简单对比 1. build后目标产物不同 vue ...
- [源码分析] 消息队列 Kombu 之 Hub
[源码分析] 消息队列 Kombu 之 Hub 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 中的 ...
- Docker 专题总结
Docker 专题总结 Docker 的基本命令 启动 Docker $ systemctl start docker 停止Docker $ systemctl stop docker 重启Docke ...