hdu 5033 單調棧 凸包

2021-06-28 23:20:15 字數 986 閱讀 4468

將人看成高度為0的樓,與樓混在一起按照橫座標排序,用單調棧正著掃一遍,再反著掃一遍,分別求出豎直線兩側的高度

出棧的條件:

1.當前樓的高度比棧頂的樓高

2.為了維護凸包的性質,若棧頂和之前樓的斜率大於棧頂和當前樓的斜率(均為絕對值),出棧

3.如果當前樓是人,向前出棧直至找到棧頂樓與人夾角大於之前的樓與人的夾角

然後將豎直線兩側的夾角相加就是最後結果

#include #include #include #include #include #include #define max 100007

#define pi (acos(-1))

using namespace std;

typedef pairpii;

stackstk;

struct building

}b[max<<1];

int t,n,m;

double ans[max];

double slope ( int id1 , int id2 )

bool check ( int i )

void solve ( int s , int e , int d )

else

}}int main ( )

scanf ( "%d" , &m );

for ( int i = 1 ; i <= m ; i++ )

sort ( b+1 , b+n+m+1 );

memset ( ans , 0 , sizeof ( ans ) );

solve ( 1 , n+m , 1 );

solve ( n+m , 1 , -1 );

printf ( "case #%d:\n" , c++ );

for ( int i = 1 ; i <= m ; i++ )

printf( "%.10lf\n" , ans[i] );

}}

hdu 5033 單調棧的維護

題意 在一條直線上,給定一系列摩天大樓的位置和高度,每次詢問自己所在位置所能看到的視野。分析 關鍵在於樓與樓之間,到當前將要加進去的樓或人的位置,若之前的樓比將要進來的樓矮,可以忽略,因為對後面有影響的,只有比將要加進去的樓高的樓,最終構成遞減序列,這是最基本的要求。對於從左邊開始連續的三幢樓a,b...

單調鏈凸包

1 monotone chain convex hull 單調鏈凸包 演算法偽 2 輸入 乙個在平面上的點集p3 點集 p 按 先x後y 的遞增排序4 m 表示共a i 0.m 個點,ans為要求的點 5structp6 14 a m 10 ans m 10 15 判斷第三點在這個直線的左側還是右側...

HDU 3410(遞減單調棧)

現在有n個人站成一行,告訴你每個人的身高。現在每個人都要找到在他左邊,比他矮的人中最高的人的位置。同時也要找到,在他右邊比他矮的人中最高的人的位置。注意由於他們是站成一行的,所以他們不能越過比他們高的人去看後面的人。也就是說,他只能看到他本人和他的左邊 或右邊 第乙個比他高的人之間的那些人。請輸出每...