題意:在一條直線上,給定一系列摩天大樓的位置和高度,每次詢問自己所在位置所能看到的視野。
分析:關鍵在於樓與樓之間,到當前將要加進去的樓或人的位置,若之前的樓比將要進來的樓矮,可以忽略,因為對後面有影響的,只有比將要加進去的樓高的樓,最終構成遞減序列,這是最基本的要求。對於從左邊開始連續的三幢樓a,b,c,其中以c為基點,若a與c構成的仰角》=b與c構成的仰角,則b對於後面更遠的樓層或人的位置將不起作用,故b可以忽略此時。
#include#include#include#include#includeusing namespace std;
struct node
double getangle(node & a,node &b)
/*實時維護單調遞減的棧,即樓高要遞減,且一定包含到目前為止將要入棧的樓,不滿足的出棧,同時若棧頂所在樓被覆蓋,則不斷出棧!
直到棧頂所在樓是目前為止視線最窄的。
*/void getans()
while(top>=2&&is_out(st[top-2],st[top-1],p[i]))
if(p[i].h
hdu 5033 單調棧 凸包
將人看成高度為 的樓,與樓混在一起按照橫座標排序,用單調棧正著掃一遍,再反著掃一遍,分別求出豎直線兩側的高度 出棧的條件 當前樓的高度比棧頂的樓高 為了維護凸包的性質,若棧頂和之前樓的斜率大於棧頂和當前樓的斜率 均為絕對值 出棧 如果當前樓是人,向前出棧直至找到棧頂樓與人夾角大於之前的樓與人的夾角 ...
HDU 3410(遞減單調棧)
現在有n個人站成一行,告訴你每個人的身高。現在每個人都要找到在他左邊,比他矮的人中最高的人的位置。同時也要找到,在他右邊比他矮的人中最高的人的位置。注意由於他們是站成一行的,所以他們不能越過比他們高的人去看後面的人。也就是說,他只能看到他本人和他的左邊 或右邊 第乙個比他高的人之間的那些人。請輸出每...
陶陶摘蘋果 線段樹維護單調棧
題庫字尾為contest 132 problem 2 目前本人比較偏向的板子中,核心是乙個calc函式,傳入兩個引數 rt 和 w w 代表 rt 節點所統領的區間所受到的限制的值。如果左兒子的最大值比 w 大,那麼就遞迴左兒子,右兒子不必再遞迴,因為單調遞增,右兒子的最小值一定大於等於左兒子的最大...