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 ...
随机推荐
- C++ 中的虚函数表及虚函数执行原理
为了实现虚函数,C++ 使用了虚函数表来达到延迟绑定的目的.虚函数表在动态/延迟绑定行为中用于查询调用的函数. 尽管要描述清楚虚函数表的机制会多费点口舌,但其实其本身还是比较简单的. 首先,每个包含虚 ...
- layui数据表格-通过点击按钮使数据表格中的字段值增加
通过点击右侧相对应的操作按钮,对迟到.休假次数实现自增效果 jsp页面代码 //监听行工具事件 table.on('tool(test)', function(obj){ var data = obj ...
- 鸿蒙应用程序Ability(能力)看这一篇就够
本节概述 什么是Ability Ability分类 Ability生命周期 Ability之间跳转 什么是Ability Ability意为能力,是HarmonyOS应用程序提供的抽象功能.在Andr ...
- 【Azure Developer】Python 获取Micrisoft Graph API资源的Access Token, 并调用Microsoft Graph API servicePrincipals接口获取应用ID
问题描述 在Azure开发中,我们时常面临获取Authorization问题,需要使用代码获取到Access Token后,在调用对应的API,如servicePrincipals接口. 如果是直接调 ...
- 01-Spring概述(总览)
Spring概述 前言 Spring 发展至现在,俨然成为一个生态,但要理解其余的 Spring Boot.Spring Cloud 等框架,需要先对 Spring 的整个体系有一定的理解,因为其余的 ...
- div+伪元素实现太极图
需求:使用div和伪元素实现阴阳太极图 图例: 代码: <html> <head> <title>太极图</title> <style type= ...
- Windows下解析命令行参数
linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...
- C语言中复杂声明的解读和简化
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
- Java进阶专题(二十六) 将近2万字的Dubbo原理解析,彻底搞懂dubbo
前言 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo.今天就从Dubbo的SPI机制.服务注册与发现源码及网络通信过程去深入剖析下Dubbo. Dubbo架构 ...
- 设计vue3的请求实体工厂
设计一个vue3的请求实体工厂 目录 设计一个vue3的请求实体工厂 描述 实现 构建一个基础请求方法 创建具体请求的方法 下面是对请求的声明文件 下面是请求的定义 generateRequest对请 ...