acm模版
在討論區中,夾克老師講得十分透徹了,我也不再做那麼詳細贅述了,大致的分析一下,根據夾克老師的說法,用單調棧分別求出來乙個數作為最大值和最小值的貢獻區間,也就是說求出這個數作為最大或者最小的值時能往前往後延伸的長度,最後根據乘法原則就能求出來每個數貢獻的區間數目。
先單調遞減棧搞一遍,求出每乙個數作為最大值所覆蓋的前後範圍,然後再單調遞增搞一遍,求出每乙個數作為最小值所覆蓋的前後範圍,這樣就差不多了,乘法原理搞一下就可以了,對了,需要注意 long long 哦。
#include
#include
using namespace std
;const int maxn = 5e4 + 10
;struct num
} a[maxn];
int n;
int value, key;
long long res = 0
;stack> s;
void stackclear()
}void getmax()
}s.push(make_pair(a[i].value, i));
}while (!s.empty())
}}void getmin()
}s.push(make_pair(a[i].value, i));
}while (!s.empty())
}}void solve()
}int main(int argc, const char * argv)
getmax();
getmin();
solve();
cout << res << '\n'
; return 0
;}
51Nod1215 陣列的寬度
題目看這裡 各種求和最好玩的啦 看到題目就應該知道要單獨考慮每個元素的貢獻 那麼乙個元素i的貢獻肯定是a i l i i i r i 這裡l,r分別表示左邊和右邊第乙個比i大的數的位置 最大值部分的貢獻算完了最小值是類似的 考慮怎麼求這個l和r,直接上單調棧就可以了 code很難看當時不知道在想什麼...
51Nod 1215 陣列的寬度(單調棧)
題目描述 思路 單調棧處理左右第一處比自己小和大的位置,然後計算每個元素對答案的貢獻,注意若干相同元素不能重複計算,所以在處理左邊第一處大於自己的位置後,右邊就要處理第一處大於等於自己的位置,這樣才不會重複計算,比自己小的位置也同理 include include include include i...
1215 陣列的寬度
1215 陣列的寬度 基準時間限制 1 秒 空間限制 131072 kb 分值 80 收藏關注n個整數組成的陣列,定義子陣列a i a j 的寬度為 max a i a j min a i a j 求所有子陣列的寬度和。input 第1行 1個數n,表示陣列的長度。1 n 50000 第2 n 1行...