1. 程式人生 > >資料結構 單調棧+幾何 摩天大樓【HDU 5033 】

資料結構 單調棧+幾何 摩天大樓【HDU 5033 】

題目大意:

就是一個人來到充滿摩天大樓的城市,所有大樓沒有寬度。建一直角座標系,給出每個建築的高度,現在求人站在(x,0)處能夠看到天空的範圍。(即不被摩天大樓阻擋)。答案只需要給出視角大小。
還是想了一會才想出。.對於一個人能看到的左界,我們可以得到下式:

kmaxxi=min((HjHi)/(XjXi)),j<=i
用求出左界的斜率即可反解該範圍的視角的角。而求最小即用單調棧維護斜率單減即可。右界同理可得。
有SPJ虛什麼精度差?
#include<iostream>
#include<cstdio>
#include<vector> #include<queue> #include<stack> #include<cmath> #include<algorithm> using namespace std; const int maxn=1000100,inf=1e9; const double pi=3.1415926535; int t,n,cnt; stack <pair<int,double> > s;//第一個是當前元素編號,第二個是與上一個元素的斜率。 struct node{ int x,h,bian; double
l,r; }a[maxn]; bool cmp(node p,node q){ return p.x<q.x; } bool cmp2(node p,node q){ return p.bian<q.bian; } double getk(int x,int y){ double x1=a[x].x,x2=a[y].x,y1=a[x].h,y2=a[y].h; return (y2-y1)/(x2-x1); } int main(){ int i,j,q;double k,a1,a2; scanf("%d",&t); for
(j=1;j<=t;j++){ scanf("%d",&n); printf("Case #%d\n",j); cnt=0; for(i=1;i<=n;i++){ scanf("%d%d",&a[i].x,&a[i].h); a[i].bian=inf;//大樓的編號為正無窮 } cnt=n; scanf("%d",&q); for(i=1;i<=q;i++){ cnt++; scanf("%d",&a[cnt].x); a[cnt].bian=i; a[cnt].h=0; } sort(a+1,a+cnt+1,cmp);//把人和摩天大樓同時排序,不用分類討論。 while(!s.empty())s.pop(); for(i=1;i<=cnt;i++){//求左界,維護斜率單減 while(!s.empty()){ k=getk(s.top().first,i); if(k>=s.top().second)s.pop(); else break; } if(s.empty()){ a[i].l=0; s.push(make_pair(i,double(inf))); } else { a[i].l=getk(s.top().first,i); s.push(make_pair(i,a[i].l)); } } while(!s.empty())s.pop(); for(i=cnt;i>=1;i--){//求右界,維護斜率單增 while(!s.empty()){ k=getk(s.top().first,i); if(k<=s.top().second)s.pop(); else break; } if(s.empty()){ a[i].r=0; s.push(make_pair(i,double(-inf))); } else { a[i].r=getk(s.top().first,i); s.push(make_pair(i,a[i].r)); } } sort(a+1,a+cnt+1,cmp2); for(i=1;i<=q;i++){ a1=atan(abs(a[i].l)); a2=atan(abs(a[i].r)); printf("%.10lf\n",(pi-a1-a2)/pi*180); } } return 0; }

相關推薦

資料結構 單調+幾何 摩天大樓HDU 5033

題目大意: 就是一個人來到充滿摩天大樓的城市,所有大樓沒有寬度。建一直角座標系,給出每個建築的高度,現在求人站在(x,0)處能夠看到天空的範圍。(即不被摩天大樓阻擋)。答案只需要給出視角大小。 還是想了一會才想出。.對於一個人能看到的左界,我們可以得到下

HDU 5033經典單調問題Building

題意: n個人,n棟樓,問每個人往左看,往右看,能夠看到的天空的最大角度。 【這是一個很經典的單調棧問題】   思路:       首先,能夠想到將人和樓全部讀入棧中進行統一處理。並且左邊跑一次單調棧,求出人能夠往左看到的最高的樓。右邊跑一

BZOJ3190[JLOI2013]賽車 單調+幾何

scrip 所有 ring 速度 ostream 正整數 一個 包括 題解 【BZOJ3190】[JLOI2013]賽車 Description 這裏有一輛賽車比賽正在進行,賽場上一共有N輛車,分別稱為個g1,g2……gn。賽道是一條無限

ACM數據結構-單調、隊列

put inf n-n www. lld queue can org strong 1.最大數 代碼: #include <stdio.h> #include <memory.h> #include <math.h> #include

數據結構--單調結構

null 不彈出 入棧 圖片 TP 彈出 一個 img -- 解決的問題:在一個數組中,每一個位置的num,找到左邊離num近的>num的值,和右邊離num近的>num的值 時間復雜度:O(N) 準備一個棧:棧底到棧頂 從大到小 遍歷數組,將數組中的元素n

數據結構--單調--求最大子矩陣的大小

最大的 其中 矩陣 直方圖 行記錄 str ont http 圖片 求最大子矩陣的大小給定一個整型矩陣map, 其中的值只有0和1兩種, 求其中全是1的所有矩形區域中, 最大的矩形區域為1的數量。例如:1 1 1 0其中, 最大的矩形區域有3個1, 所以返回3。再如:1 0

數據結構--單調--烽火臺

設計 倒數 行為 筆試 https 通路 eight git 能夠 京東筆試編程題:烽火臺,動態規劃解法| Hexo https://www.nowcoder.com/discuss/8704?type=0&order=0&pos=5&page=0

資料結構實現檢查左右括號是否匹配

def isValid(self,s): stack = [] paren_map = {')': '(', ']': '[', '}': '{'} for c in s: if c not in paren_map: stack.appe

資料結構 順序 操作集

程式碼如下: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #define STACK_INIT_SIZE 10 using name

資料結構--順序

文章目錄 sequence_ctack.h sequence_stack.c main.c 執行結果 sequence_ctack.h #ifndef __SEQUENCE_STACK_H__ #define __S

資料結構結構

資料結構之棧結構     棧結構:線性結構。從資料的儲存結構來進一步劃分,棧結構包括兩類:        順序棧結構:使用一組地址連續的記憶體單元依次儲存棧中的資料;    

Python資料結構之: 與佇列

棧(stacks) 是一種只能通過訪問其一端來實現資料儲存與檢索的線性資料結構,具有後進先出(last in first out,LIFO)的特徵 stack = [] stack.append("A") #A入棧 stack.append("B") #B入棧 st

資料結構3--(java實現的順序儲存)

1.棧      棧也叫堆疊,是一種限制只能在某一端進行插入和刪除操作的線性表                          

資料結構及應用

  棧的定義:      棧是隻能在一端進行資料插入和刪除的線性表。 棧的性質:      後進先出(FILO),後面進去的元素,先出來,先進去的元素後出來 棧的操作:      棧的操作很簡單,就是

關於資料結構 樹 以及記憶體分配中的堆

在現如今的教材中 關於棧,堆,樹等概念比較模糊 正確的解釋如下 棧是一種資料表 操作滿足先進後出(類似木桶) 【標準解釋:只能從表的固定一端對資料進行插入與刪除操作,另一端封死。開頭的一端為棧頂,封死的一端為棧底】 樹: 樹的邏輯結構:樹中任何結點都可以有零個或多個直接後繼節點,但至

常見資料結構(一)-,佇列,堆,雜湊表

轉載:https://blog.csdn.net/u013063153/article/details/54667361?locationNum=8&fps=1 寫在前面 本文所有圖片均截圖自coursera上普林斯頓的課程《A

資料結構筆記-與佇列python實現

概述 棧與佇列是程式設計中被廣泛應用的兩種重要的資料結構,都是在特定範圍的儲存單元記憶體儲資料,這些資料都可以被重新取出使用,與線性表相比,他們的插入和刪除受到更多的約束,固又稱限定性的線性表結構。他們是最簡單的快取結構,他們只支援資料項的儲存與訪問,不支援資料項之間的任何關係。因此,這兩種

資料結構四——

  4.1棧的定義:   4.2 棧的資料型別 4.3 棧的順序儲存結構 棧的operation: 初始化和清空都是一樣的操作: 判斷是否為空: 壓棧

軟考:資料結構基礎——

我們實現了可以動態增加棧大小的動態棧 並對realloc 函式的使用方法回顧了一下   一、棧的定義     1.棧是隻能訪問它的一端來實現資料的儲存和檢索的一種線性結構,他是一種LIFO(Last In First Out)先進先出的線性表。

資料結構——順序(動態分配空間)的基本操作

程式碼主要來源:【資料結構】【清華大學】【嚴蔚敏】 順序棧S的基本運算如下: (1)初始化棧S (2)棧為空 (3)依次進棧元素a,b,c,d,e (4)棧為非空 (5)出棧序列:e d c b a (6)棧為空 (7)釋放棧 完整程式碼如下: #include <stdio.