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