C++ 单调栈

C++单调栈模版代码:

cpp 复制代码
#include<iostream>
#include<vector>
#include<stack>
using namespace std;

/*单调栈模版*/
#define maxn 100001
#define inf 2000000000

template<typename T>
bool cmp(T a, T b) {
	return a > b;
}
// ans[i]代表从i往左走,找到的第一个满足条件的下标
template<typename T>
void findFirstMeetOnleft(int n, T h[], int ans[]) {
	stack<int> stk;
	h[0] = inf;
	stk.push(0);
	for (int i = 1; i <= n; ++i) {
		while(!cmp(h[stk.top()],h[i])) {
			stk.pop();
		}
		ans[i] = stk.top();
		stk.push(i);

	}
}

template<typename T>
void reverseArray(int n, T arr[]) {
	for (int i = 1; i <= n / 2; ++i) {
		T tmp = arr[i];
		arr[i] = arr[n + 1 - i];
		arr[n + 1 - i] = tmp;
	}
}

/*单调栈模版*/
int h[maxn], ans[maxn];

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> h[i];
	}
	findFirstMeetOnleft(n, h, ans);
	for (int i = 1; i <= n; ++i) {
		cout << ans[i] << " ";
	}
	cout << endl;
	return 0;
}

代码练习 1,伦太郎的等待,对应蓝桥云课 代码见下

cpp 复制代码
#include<iostream>
#include<vector>
#include<stack>
using namespace std;

/*单调栈模版*/
#define maxn 100001
#define inf 2000000000

template<typename T>
bool cmp(T a, T b) {
	return a >= b;
}
// ans[i]代表从i往左走,找到的第一个满足条件的下标
template<typename T>
void findFirstMeetOnleft(int n, T h[], int ans[]) {
	stack<int> stk;
	h[0] = inf;
	stk.push(0);
	for (int i = 1; i <= n; ++i) {
		while(!cmp(h[stk.top()],h[i])) {
			stk.pop();
		}
		ans[i] = stk.top();
		stk.push(i);

	}
}

template<typename T>
void reverseArray(int n, T arr[]) {
	for (int i = 1; i <= n / 2; ++i) {
		T tmp = arr[i];
		arr[i] = arr[n + 1 - i];
		arr[n + 1 - i] = tmp;
	}
}

/*单调栈模版*/
int h[maxn], ans[maxn];

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> h[i];
	}
	findFirstMeetOnleft(n, h, ans);
	int ret = 0;
	for (int i = 1; i <= n; ++i) {
		ret += i - ans[i] - 1;
	}
	cout << ret << endl;
	return 0;
}

代码练习2 对应蓝桥云课 百亿富翁 代码见下

cpp 复制代码
#include<iostream>
#include<vector>
#include<stack>
using namespace std;

/*单调栈模版*/
#define maxn 700001
#define inf 2000000000

template<typename T>
bool cmp(T a, T b) {
	return a > b;
}
// ans[i]代表从i往左走,找到的第一个满足条件的下标
template<typename T>
void findFirstMeetOnleft(int n, T h[], int ans[]) {
	stack<int> stk;
	h[0] = inf;
	stk.push(0);
	for (int i = 1; i <= n; ++i) {
		while(!cmp(h[stk.top()],h[i])) {
			stk.pop();
		}
		ans[i] = stk.top();
		stk.push(i);

	}
}

template<typename T>
void reverseArray(int n, T arr[]) {
	for (int i = 1; i <= n / 2; ++i) {
		T tmp = arr[i];
		arr[i] = arr[n + 1 - i];
		arr[n + 1 - i] = tmp;
	}
}

/*单调栈模版*/
int h[maxn], ans[maxn];

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> h[i];
	}
	findFirstMeetOnleft(n, h, ans);
	for (int i = 1; i <= n; ++i) {
		if (ans[i] == 0) ans[i] = -1;
		cout << ans[i] << ' ';
	}
	cout << endl;
	reverseArray(n, h);
	findFirstMeetOnleft(n, h, ans);
	reverseArray(n, ans);
	reverseArray(n, h);
	for (int i = 1; i <= n; ++i) {
		if (ans[i] == 0) ans[i] = -1;
		else ans[i] = (n + 1) - ans[i];
		cout << ans[i] << ' ';
	}
	cout << endl;
	return 0;
}

代码练习3 对应蓝桥云课 最大区间 代码见下

cpp 复制代码
#include<iostream>
#include<vector>
#include<stack>
using namespace std;

/*单调栈模版*/
#define maxn 300001
#define inf -1

template<typename T>
bool cmp(T a, T b) {
	return a < b;
}
// ans[i]代表从i往左走,找到的第一个满足条件的下标
template<typename T>
void findFirstMeetOnleft(int n, T h[], int ans[]) {
	stack<int> stk;
	h[0] = inf;
	stk.push(0);
	for (int i = 1; i <= n; ++i) {
		while(!cmp(h[stk.top()],h[i])) {
			stk.pop();
		}
		ans[i] = stk.top();
		stk.push(i);

	}
}

template<typename T>
void reverseArray(int n, T arr[]) {
	for (int i = 1; i <= n / 2; ++i) {
		T tmp = arr[i];
		arr[i] = arr[n + 1 - i];
		arr[n + 1 - i] = tmp;
	}
}

/*单调栈模版*/
int h[maxn], l[maxn], r[maxn];

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> h[i];
	}
	findFirstMeetOnleft(n, h, l);
	reverseArray(n, h);
	findFirstMeetOnleft(n, h, r);
	reverseArray(n, h);
	reverseArray(n, r);
	for (int i = 1; i <= n; ++i) {
		r[i] = (n + 1) - r[i];
	}
	long long max = 0;
	for (int i = 1; i <= n; ++i) {
		long long x = (r[i] - 1) - (l[i] + 1) + 1;
		x = x * h[i];
		if (x > max) {
			max = x;
		}
	}
	cout << max << endl;
	return 0;
}
相关推荐
逑之1 小时前
C语言笔记10:sizeof和strlen,指针与数组
c语言·笔记·算法
求梦8201 小时前
【力扣hot100题】旋转图像(15)
算法·leetcode·职场和发展
C雨后彩虹5 小时前
任务最优调度
java·数据结构·算法·华为·面试
少林码僧7 小时前
2.31 机器学习神器项目实战:如何在真实项目中应用XGBoost等算法
人工智能·python·算法·机器学习·ai·数据挖掘
钱彬 (Qian Bin)7 小时前
项目实践15—全球证件智能识别系统(切换为Qwen3-VL-8B-Instruct图文多模态大模型)
人工智能·算法·机器学习·多模态·全球证件识别
微露清风7 小时前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
Niuguangshuo8 小时前
EM算法详解:解密“鸡生蛋“的机器学习困局
算法·机器学习·概率论
a3158238068 小时前
Android 大图显示策略优化显示(一)
android·算法·图片加载·大图片
CSARImage8 小时前
C++读取exe程序标准输出
c++
一只小bit8 小时前
Qt 常用控件详解:按钮类 / 显示类 / 输入类属性、信号与实战示例
前端·c++·qt·gui