wls的数据结构-单调栈和单调队列

单调栈

// 求离某个元素最近的第一个比他大的或者比他小的元素的角标
#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 2e5+10;
int q[N], hh = -1, a[N];
for(int i = 1; i <= n; i ++){
	while(hh >= 0  && a[q[hh]] < a[i]){
		res[q[hh]] = i;
		hh --;
	}
	q[++hh] = i;
}

  枚举每一个元素的高度,他左边和右边最远能到哪里
#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 2e5+10;
int a[N], p[N], phh = -1, l[N], lhh = -1;
int pre[N], later[N];
int main(){
	int n; cin >> n;
	for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
	for(int i = 1; i <= n; i ++) later[i] = n + 1;
	for(int i = 1; i <= n; i ++){
		while(phh >= 0 && a[p[phh]] > a[i]){
			later[p[phh]] = i;
			phh --;
		}
		p[++phh] = i;
	}
	for(int  i = n; i >= 1; i --){
		while(lhh >= 0 && a[l[lhh]] > a[i]){
			pre[l[lhh]] = i;
			lhh --;
		}
		l[++lhh] = i;
	}
	LL res = 0;
	for(int i = 1; i <= n; i ++){
		res = max(res, (LL)a[i] * (later[i] - pre[i] - 1));
	}
	cout << res << endl;
    return 0;
}

posted @ 2022-03-28 21:50  牛佳文  阅读(52)  评论(0编辑  收藏  举报