資料結構 單調棧+幾何 摩天大樓【HDU 5033 】
題目大意:
就是一個人來到充滿摩天大樓的城市,所有大樓沒有寬度。建一直角座標系,給出每個建築的高度,現在求人站在(x,0)處能夠看到天空的範圍。(即不被摩天大樓阻擋)。答案只需要給出視角大小。
還是想了一會才想出。.對於一個人能看到的左界,我們可以得到下式:
用求出左界的斜率即可反解該範圍的視角的角。而求最小即用單調棧維護斜率單減即可。右界同理可得。
#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.