I - Max answer 計蒜客 - 38228 單調棧
題目:I - Max answer 計蒜客 - 38228
分析:
這個題對於正數我們可以列舉最小值,求左右可擴充套件的最遠處(用單調棧),貢獻答案。
對於負數的情況,可以結合“陣列的最大子陣列和"一題來考慮,即O(n)求子陣列最大/小和。對於這個題,我們在維護MinSum的時候,同時維護對應區間的最小負數min,並利用min * MinSum貢獻答案。
程式碼:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;//三年競賽一場空,不開long long見祖宗
//typedef __int128 lll;
#define print(i) cout << "debug: " << i << endsl
#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define mem(a, b) memset(a, b, sizeof(a))
#define pb(a) push_back(a)
#define x first
#define y second
typedef pair<int, int> pii;
const ll mod = 1e9 + 7;
const int maxn = 5e5 + 10;
const int inf = 0x3f3f3f3f;
int l[maxn], r[maxn];
ll a[maxn], sum[maxn];
int n;
stack<int> st;
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i], sum[i] = sum[i - 1] + a[i];
for(int i = 1; i <= n; i++) l[i] = i, r[i] = n;
//單調棧模板,求以某一個數為min,可以向延伸的最左和最右
for(int i = 1; i <= n; i++)
{
if(st.empty() || a[i] > a[st.top()]) st.push(i);
else
{
while(!st.empty() && a[i] <= a[st.top()])
{
int pos = st.top(); st.pop();
l[i] = l[pos];//這裡極其容易出錯.
r[pos] = i - 1;
}
st.push(i);
}
}
ll res = -1;
for(int i = 1; i <= n; i++)
res = max(res, a[i] * (sum[r[i]] - sum[l[i] - 1]));
ll sum = 0, minv = 0;
for(int i = 1; i <= n; i++)
{
if(sum > 0) sum = 0, minv = 0;
sum += a[i];
minv = min(minv, a[i]);
res = max(res, sum * minv);
}
cout << res << endl;
}
相關文章
- 計蒜客 - T1151 - 奇數單增序列
- 計蒜客:騎車比賽(Dijkstra)
- 單調棧/單調佇列佇列
- 單調棧 和 單調佇列佇列
- 單調棧和單調佇列佇列
- 計蒜客:農場看守(DFS、尤拉回路)
- 計蒜客:最甜的蘋果(線段樹)蘋果
- 計蒜客 - T1342 - 雞兔同籠
- 單調棧模板
- 計蒜客 煩惱的高考志願題解
- 計蒜客 移除陣列中的重複元素陣列
- 【計蒜客】2017藍橋杯模擬賽(四)
- 淺談單調棧
- 程式碼填空:組合數字 計蒜客 - A1145
- C - Digital Path 計蒜客 - 42397(dp記憶化搜尋)Git
- 【藍橋杯】計蒜客2017模擬賽A習題整理
- 單調棧學習小思考
- 演算法之單調棧演算法
- B - 結果填空:炮臺實驗 計蒜客 - A2222(沒理解)
- [JSOI2008] 最大數 (單調棧)JS
- HISTOGRA - 最大矩形面積(單調棧)
- 特殊資料結構:單調棧資料結構
- HBO Max for Mac HBO Max影片客戶端Mac客戶端
- 【筆記】線段維護單調棧筆記
- 單調棧進階-接雨水-最大矩形
- Leetcode:單調棧_可見山峰問題LeetCode
- LeetCode Monotone Stack Summary 單調棧小結LeetCodeMono
- Largest Submatrix of All 1’s(思維+單調棧)
- 第十章 單調棧 Part2
- Leetcode321. 拼接最大數——單調棧的使用LeetCode
- codeforce 686div3 F Array Partition單調棧
- Codeforces #123D: 字尾陣列+單調棧3D陣列
- bzoj3190: [JLOI2013]賽車(單調棧)
- 關於 i=i++ 問題、入棧順序
- bzoj1113: [Poi2008]海報PLA(單調棧)
- 9.6-小訓練 三分小板子+單調棧
- bzoj1345: [Baltic2007]序列問題Sequence(單調棧)
- 簡單計算器(棧的應用)