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 最大仰望角相关推荐
- 【Language model】使用RNN LSTM训练语言模型 写出45°角仰望星空的文章
开篇 这篇文章主要是实战内容,不涉及一些原理介绍,原理介绍为大家提供一些比较好的链接: 1. Understanding LSTM Networks : RNN与LSTM最为著名的文章,贴图和内容都恰 ...
- python实现全角和半角互相转换
全角转半角 # encoding=utf-8 #! /usr/bin/pythonimport sys import reif len(sys.argv) != 3:print("\nERR ...
- SQL 全角半角转换-(摘抄)
/****** SQL转换全角/半角函数 开始******/ CREATE FUNCTION ConvertWordAngle ( @str NVARCHAR(4000), --要转换的字符串 @fl ...
- 《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测
10.3 亚像素级角点检测 10.3.1 亚像素级角点检测原理 1.原理: 假设起始角点在实际亚像素角点附近,检测所有q-p向量,下面两种情况点p梯度与q-p向量的点积均为0:(1)点p附近图像均 ...
- 《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测
10.2 Shi-Tomasi角点检测 10.2.1 Shi-Tomasi角点检测:goodFeaturesToTrack()函数 1.定义: Harris算法改进,若矩阵M行列式的值与M的迹中较 ...
- 《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测
第10章 角点检测 10.1 Harris角点检测 10.1.1 角点 1.图像特征类型: (1)边缘 (2)角点(感兴趣点) (3)斑点(感兴趣区域) 2.角点定义: (1) 一阶导数(灰度的梯度) ...
- Halcon:(3)铝板检测与角点坐标计算
如下图所示我们要检测到图片中的铝板,并计算出铝板左下角的角点坐标: 在进行铝板检测的时候,我们发现铝板是高亮部分,但是旁边也会有高亮部分的边缘点的干扰,我么需要把那些干扰点给去掉, 角点坐标的公式推导 ...
- harris角点检测与绘制。通过滑动滚动条来控制阈值,以控制检测角点的数量并返回角点坐标
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; ...
- OpenCV(24)角点检测3 -- ORB
目录 一.基础理论 1.原理 2.BRIEF算法介绍 1.介绍 2.过程 3.API介绍 1.ORB_create函数(初始化orb检测器) 2.orb.detectAndCompute函数(检测关键 ...
最新文章
- 他智商167,超过爱因斯坦,花17年炸遍美国高校,却因一疏漏被捕
- windows7下安装MongoDB数据库
- golang并发和并行
- leetcode 621. Task Scheduler | 621. 任务调度器(Java)
- Ubantu18.04安装Vivado
- python超神之路:创建对象的9种方法
- 移动端web开发整理
- 处理机器学习大数据的7种方法
- 这个可能打败Python的编程语言,正在征服科学界
- linux一键安装node+npm
- 计算机二级offic高级应用备考,备考2021计算机二级—二级MS Office高级应用高频考点.pdf...
- 5. DOM解析XML
- 移动金库模式保护客户信息 覆盖17套关键系统
- 基于android的订餐系统 答辩ppt,外卖订餐系统答辩PPT
- Java配置Path
- 风险管理-输入、输出、工具和技术
- Office卸载不干净,注册表项权限修改后仍然无法删除的问题
- OC dyld750调用分析
- 人工智能兴起的条件_跟我说规矩。 AI受虐狂的兴起
- windows xp apache php mysql_WindowsXP下安装和配置Apache2.2.22服务器+PHP5+Mysql5 wu金