1、定义
单调队列顾名思义就是具有单调性的队列
单调性:所有元素保持同一种状态(递减 or 递增)
2、作用
可以优化dp,求最值
将元素压入队列之中,同时保持队列的单调性,之后再取出队首(最优当前解)
3、使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
   | #include<bits/stdc++.h> #define gt getchar() #define int long long using namespace std;
  const int maxn = 100001; int n, l, r; int v[maxn];  int sum[maxn]; int q[maxn], dp[maxn]; int x, head, tail, ans;
  int read() { 	char c = gt; 	int x = 0, f = 1; 	for(; !isdigit(c); c = gt) if(c == '-') f = -1; 	for(; isdigit(c); c = gt) x = (x << 1) + (x << 3) + (c ^ 48); 	return f * x; } #define r1 read()
  signed main() { 	n = r1; 	int i, j; 	tail = 0; 	for(i = 1; i <= n; i ++) { 		v[i] = r1; 		sum[i] = sum[i - 1] + v[i]; 	} 	v[++n] = 0; 	for(i = 1; i <= n; i ++) { 		while(v[q[tail]] > v[i]) 		{ 			dp[q[tail]] = dp[q[tail]] + sum[i - 1] - sum[q[tail]]; 			tail--; 		} 		dp[i] = sum[i] - sum[q[tail]]; 		q[++tail] = i; 	} 	for(i = 1; i <= n - 1; i ++) { 		ans = max(ans, v[i] * dp[i]); 	} 	printf("%lld\n",ans); 	return 0; } 
   |