题意:
      给你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 最大仰望角相关推荐

  1. 【Language model】使用RNN LSTM训练语言模型 写出45°角仰望星空的文章

    开篇 这篇文章主要是实战内容,不涉及一些原理介绍,原理介绍为大家提供一些比较好的链接: 1. Understanding LSTM Networks : RNN与LSTM最为著名的文章,贴图和内容都恰 ...

  2. python实现全角和半角互相转换

    全角转半角 # encoding=utf-8 #! /usr/bin/pythonimport sys import reif len(sys.argv) != 3:print("\nERR ...

  3. SQL 全角半角转换-(摘抄)

    /****** SQL转换全角/半角函数 开始******/ CREATE FUNCTION ConvertWordAngle ( @str NVARCHAR(4000), --要转换的字符串 @fl ...

  4. 《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测

    10.3 亚像素级角点检测 10.3.1 亚像素级角点检测原理 1.原理:   假设起始角点在实际亚像素角点附近,检测所有q-p向量,下面两种情况点p梯度与q-p向量的点积均为0:(1)点p附近图像均 ...

  5. 《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测

    10.2 Shi-Tomasi角点检测 10.2.1 Shi-Tomasi角点检测:goodFeaturesToTrack()函数 1.定义:   Harris算法改进,若矩阵M行列式的值与M的迹中较 ...

  6. 《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测

    第10章 角点检测 10.1 Harris角点检测 10.1.1 角点 1.图像特征类型: (1)边缘 (2)角点(感兴趣点) (3)斑点(感兴趣区域) 2.角点定义: (1) 一阶导数(灰度的梯度) ...

  7. Halcon:(3)铝板检测与角点坐标计算

    如下图所示我们要检测到图片中的铝板,并计算出铝板左下角的角点坐标: 在进行铝板检测的时候,我们发现铝板是高亮部分,但是旁边也会有高亮部分的边缘点的干扰,我么需要把那些干扰点给去掉, 角点坐标的公式推导 ...

  8. harris角点检测与绘制。通过滑动滚动条来控制阈值,以控制检测角点的数量并返回角点坐标

    #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; ...

  9. OpenCV(24)角点检测3 -- ORB

    目录 一.基础理论 1.原理 2.BRIEF算法介绍 1.介绍 2.过程 3.API介绍 1.ORB_create函数(初始化orb检测器) 2.orb.detectAndCompute函数(检测关键 ...

最新文章

  1. 他智商167,超过爱因斯坦,花17年炸遍美国高校,却因一疏漏被捕
  2. windows7下安装MongoDB数据库
  3. golang并发和并行
  4. leetcode 621. Task Scheduler | 621. 任务调度器(Java)
  5. Ubantu18.04安装Vivado
  6. python超神之路:创建对象的9种方法
  7. 移动端web开发整理
  8. 处理机器学习大数据的7种方法
  9. 这个可能打败Python的编程语言,正在征服科学界
  10. linux一键安装node+npm
  11. 计算机二级offic高级应用备考,备考2021计算机二级—二级MS Office高级应用高频考点.pdf...
  12. 5. DOM解析XML
  13. 移动金库模式保护客户信息 覆盖17套关键系统
  14. 基于android的订餐系统 答辩ppt,外卖订餐系统答辩PPT
  15. Java配置Path
  16. 风险管理-输入、输出、工具和技术
  17. Office卸载不干净,注册表项权限修改后仍然无法删除的问题
  18. OC dyld750调用分析
  19. 人工智能兴起的条件_跟我说规矩。 AI受虐狂的兴起
  20. windows xp apache php mysql_WindowsXP下安装和配置Apache2.2.22服务器+PHP5+Mysql5 wu金

热门文章

  1. Unix时间戳转换(python)
  2. linux运维实战练习
  3. 修改Eclipse格式化代默认长度
  4. c# 多线程多个参数
  5. 如何正确的阅读Datasheet?
  6. BZOJ 2303 方格染色(带权并查集)
  7. 8.Layout布局应用
  8. 文件传输:二进制文件传输与文本传输(file transfer)
  9. JAVASCRIPT学习笔记----Javascript引用类型
  10. Linux下目录/文件颜色的含义