当前位置: 首页 > news >正文

C++ 单调栈

C++单调栈模版代码:

#include<iostream>
#include<vector>
#include<stack>
using namespace std;/*单调栈模版*/
#define maxn 100001
#define inf 2000000000template<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,伦太郎的等待,对应蓝桥云课 代码见下

#include<iostream>
#include<vector>
#include<stack>
using namespace std;/*单调栈模版*/
#define maxn 100001
#define inf 2000000000template<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 对应蓝桥云课 百亿富翁 代码见下

#include<iostream>
#include<vector>
#include<stack>
using namespace std;/*单调栈模版*/
#define maxn 700001
#define inf 2000000000template<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 对应蓝桥云课 最大区间 代码见下

#include<iostream>
#include<vector>
#include<stack>
using namespace std;/*单调栈模版*/
#define maxn 300001
#define inf -1template<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;
}

http://www.dtcms.com/a/545436.html

相关文章:

  • 电商网站开发 上海wordpress 登陆 没反应
  • 服务器网站备案wordpress三道杠菜单
  • mysql upsert 用法(批量保存或更新)
  • 海康相机与机器人标定
  • 十年后,AI会赋予工业怎样的力量?
  • 西安市建设协会网站高级搜索入口
  • 东莞个人网站推广建设做中东市场哪个网站合适
  • Spring Boot 3 整合 LiteFlow:轻量级流程编排框架学习
  • Rust:WebSocket支持的实现
  • 代刷开通建设网站Wordpress怎么添加购买页面
  • 做网站几个步骤网址推荐你会感谢我的
  • 黑马商城day7-消息可靠性
  • wpsapi
  • Postman实现jwt发送请求
  • 网站正在备案什么是网络营销 职能是什么
  • 【AI】Prompt 提示词工程
  • R语言高效数据处理-3个自定义函数笔记
  • 石家庄做网站备案有哪些公司品牌广告公司网站建设
  • 纯静态网站怎么入侵报告王妃
  • 郑州微盟网站建设公司网站建设的目的和目标
  • 仓颉中的字符串常用方法:语义一致性与高性能的设计哲学
  • 新MCU开发板快速上手指南:从开箱到精通
  • NestJS 项目创建
  • Apache Spark算法开发指导-特征转换-StandardScaler
  • 两个2的n次幂相加
  • 实时Java规范(RTSJ):从理论到实践的实时系统编程范式
  • 【Linux网络】进程间关系与守护进程
  • 建设部网站监理工程师报名wordpress菜单修改
  • vue 做网站 seo大连网站设计培训班
  • 【含文档+PPT+源码】基于SpringBoot和Vue的服装在线搭配及销售管理系统