就是利用rig和lef陣列記錄左邊連續的比自身高的最遠位置,然後統計,每次只要找到乙個中斷點則查詢結束,避免了重複運算,最壞複雜度是n^2但平均複雜度,但對於一般的資料還是有很優秀的複雜度的
#include #include #include #include #define max 100007
using namespace std;
typedef long long ll;
ll h[max];
ll rig[max];
ll lef[max];
int main ( )
for ( int i = 2 ; i <= n ; i++ )
while ( lef[i] > 1 && h[lef[i]-1] >=h[i] )
lef[i] = lef[lef[i]-1];
for ( int i = n-1 ; i >= 1 ; i-- )
while ( rig[i] < n && h[rig[i]+1] >= h[i] )
rig[i] = rig[rig[i]+1];
ll ans = 0;
for ( int i = 1 ; i <= n ; i++ )
ans = max ( ans , ( rig[i] - lef[i] + 1 )*h[i] );
printf ( "%i64d\n" , ans );
}}
(連續的矩形)HDU 1506
題意 7 2 1 4 5 1 3 3 直接講資料 給出7個矩形的高,底長都為1,求最大的連通的矩形塊的面積 思路 如果暴力的話肯定超時,有乙個特別巧妙的預處理,如果我們知道每乙個矩形的左右兩邊能延伸到哪就好了,這相當於乙個並查集 如果我找到了 i 並且小於等於第 i 1 的高度,那 i 1 的左邊界...
HDU3938 並查集 並查集
先按邊權值排個序,每次加入一條邊,用並查集,關鍵看懂題。include include include include using namespace std const int maxn 10010 int n,m,q struct edge edges maxn 5 inline int cmp...
hdu 3038 擴充套件並查集 向量思想
題意 給出區間 1,n 下面有m組資料,l r v區間 l,r 之和為v,每輸入一組資料,判斷此組條件是否與前面衝突 最後輸出與前面衝突的資料的個數.看大佬的部落格 向量偏移好秀啊,可以直接找到根節點和子節點的關係。對於集合裡的任意兩個元素x,y而言,它們之間必定存在著某種聯絡,因為並查集中的元素均...