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

云盘做网站萧县建设局网站

云盘做网站,萧县建设局网站,360网站推广官网球阀,旅游做攻略的网站有哪些一、单调栈 1、使用场景 解决元素左 / 右侧第一个比他大 / 小的数字。 2、原理解释 用栈解决,目标是栈顶存储答案。 以元素左侧第一个比他小为例: (1)遍历顺序一定是从左向右。 (2)由于栈顶一定是答…

一、单调栈

1、使用场景

解决元素左 / 右侧第一个比他大 / 小的数字。

2、原理解释

用栈解决,目标是栈顶存储答案。

以元素左侧第一个比他小为例:

(1)遍历顺序一定是从左向右。

(2)由于栈顶一定是答案,所以如果栈顶比遍历到的元素大或相等,那就是不合法的,此时一直出栈。 

(3)一直到栈空或栈顶比元素小,分别表示元素左边没有数比元素小和元素左边有数比元素小。更新答案。

(4)此时不管怎么样都把元素入栈,因为这个元素可能会是之后的答案。

3、代码

例题:单调栈

P5788 【模板】单调栈 - 洛谷

// https://www.luogu.com.cn/problem/P5788
#include "bits/stdc++.h"
using namespace std;
// 找到右边大的数
// 除非我遍历到的这个数比顶大我才一直出栈(循环解决),栈为空那就是右边没有比我大的我入栈,栈不为空那说说明右边有比我大的我入栈
const int N = 1e7;
int a[N];
int ans[N];int main()
{int n;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];stack<int> st;for(int i = n; i >= 1; i--){while(st.size() && a[st.top()] <= a[i])st.pop();if(st.empty()){st.push(i);ans[i] = 0;}else {ans[i] = st.top();st.push(i);}}for(int i = 1; i <= n; i++){cout << ans[i] << ' ';}return 0;
}

4、例题

发射站

P1901 发射站 - 洛谷

// https://www.luogu.com.cn/problem/P1901
#include "bits/stdc++.h"
using namespace std;
#define ll long long
// 两个数组:
// 左边离塔最近的高于这个塔的下标
// 右边离塔最近的高于这个塔的下标
// 两个栈分别找到
// 加能量应该是左边比塔高的那个塔加这个塔的能量,top += i
const int N = 1e6 + 10;int sum[N]; // 对应下标的塔接受的能量
int v[N]; // 塔的高度
int e[N]; // 塔的能量
int ans = 0;
int main()
{int n;cin >> n;for(int i = 1; i <= n; i++)cin >> v[i] >> e[i];stack<int> st1;stack<int> st2;for(int i = 1; i <= n; i++){while(st1.size() && v[i] >= v[st1.top()])st1.pop();if(st1.size()){sum[st1.top()] += e[i];}st1.push(i);}for(int i = n; i >= 1; i--){while(st2.size() && v[i] >= v[st2.top()])st2.pop();if(st2.size()){sum[st2.top()] += e[i];}st2.push(i);}for(int i = 1; i <= n; i++){ans = max(ans, sum[i]);}cout << ans;return 0;
}

二、单调队列

1、使用场景

滑动窗口极值问题。

2、原理解释

用队列,目标是队头是答案。

以滑动窗口中的极大值为例:

(1)因为队头是窗口中的最大值,所以一个元素要入队尾插那一定是尽可能向前走,即比元素小的或相等的(刚进来的元素不容易被淘汰,所以相等的老东西也要走)全部尾删。

(2)最后队为空或者尾删停下后,更新尾插。

(3)解决完入队逻辑之后还要解决数据过期,即不在窗口内的元素要清除,所以在每次插入新元素之后对于下标过期的数据循环头删。

3、代码

例题:单调队列

P1886 滑动窗口 /【模板】单调队列 - 洛谷

// https://www.luogu.com.cn/problem/P1886
#include "bits/stdc++.h"
using namespace std;
const int N = 1e6 + 10;
int a[N];
// 双端队列,存下标防止数据过期
// 最小值:队为空直接加,来的数比队尾大不一定就不是后面的答案尾插,来的数比队尾小或等于可以竞争这个范围内的最小值,所以一直尾删。每次最后清除所有不合法下标。
// 最大值:队为空直接加,来的数比队尾小不一定就不是后面的答案尾插,来的数比队尾大或等于可以竞争这个范围内的最大值,所以一直尾删。每次最后清除所有不合法下标。
int main()
{int n, k;deque<int> dq1;deque<int> dq2;cin >> n >> k;for(int i = 1; i <= n; i++)cin >> a[i];// 最小for(int i = 1; i <= n; i++){while(dq1.size() && a[i] <= a[dq1.back()]) dq1.pop_back();dq1.push_back(i);while(dq1.front() <= i - k)dq1.pop_front();if(i >= k)cout << a[dq1.front()] << ' ';}cout << endl;// 最大for(int i = 1; i <= n; i++){while(dq2.size() && a[i] >= a[dq2.back()]) dq2.pop_back();dq2.push_back(i);while(dq2.front() <= i - k)dq2.pop_front();if(i >= k)cout << a[dq2.front()] << ' ';}return 0;
}

4、例题

1、质量检测

P2251 质量检测 - 洛谷

// https://www.luogu.com.cn/problem/P2251
#include "bits/stdc++.h"
using namespace std;
const int N = 1e6 + 10;
int a[N];
int main()
{int n, m;cin >> n >> m;for(int i = 1; i <= n; i++)cin >> a[i];deque<int> dq;for(int i = 1; i <= n; i++){while(dq.size() && a[i] <= a[dq.back()])dq.pop_back();dq.push_back(i);while(dq.front() <= i - m)dq.pop_front();if(i >= m)cout << a[dq.front()] << endl;}return 0;
}

2、HISTOGRA - Largest Rectangle in a Histogram

SP1805 HISTOGRA - Largest Rectangle in a Histogram - 洛谷

// https://www.luogu.com.cn/problem/SP1805
#include <iostream>
#include <stack>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int n;
LL h[N];
LL x[N], y[N];
int main()
{
while(cin >> n, n)
{
for(int i = 1; i <= n; i++) cin >> h[i];
// 找左边,⼩
stack<int> st;
for(int i = 1; i <= n; i++)
{
// 单调递增的栈 - 存下标
while(st.size() && h[st.top()] >= h[i]) st.pop();
if(st.size()) x[i] = st.top();
else x[i] = 0;
st.push(i);
}
// 找右边,⼩
while(st.size()) st.pop();
for(int i = n; i >= 1; i--)
{while(st.size() && h[st.top()] >= h[i]) st.pop();
if(st.size()) y[i] = st.top();
else y[i] = n + 1;
st.push(i);
}
LL ret = 0;
for(int i = 1; i <= n; i++)
{
ret = max(ret, h[i] * (y[i] - x[i] - 1));
}
cout << ret << endl;
}
return 0;
}
http://www.dtcms.com/wzjs/536235.html

相关文章:

  • 行业电子商务网站有哪些如何 攻击网站
  • 做网站需要注册什么公司购物网站二级页面模板
  • 河南省两学一做网站网页制作用什么软件做
  • 网站开发自适应视频网站的广告能怎么做
  • 广州番禺网站建设成都住建局官网房源
  • 绵阳建网站医疗网站怎么做优化
  • 电脑网站怎么做的贵阳手机网站开发
  • 酥糖的网站建设的目的是什么网页设计的基本元素
  • 畜牧业网站建设哪些网站做二手挖机
  • 网站策划编辑招聘分析网站设计对网站搜索引擎友好性的影响
  • 茂名网站制作价格无棣网站定制
  • vs2017建设网站微网站的定义
  • 在搜狐快站上做网站怎么跳转微信网页版手机端
  • 网页设计自学视频网站四川企业seo
  • 专业做蛋糕视频网站国内网页设计公司前十名
  • 微信网站wordpress 下载页面模板
  • 中国优秀网站设计上海关键词优化推荐
  • 工厂弄个网站做外贸如何处理官方微信公众号怎么创建
  • 网站添加在线qq聊天如何做flash游戏下载网站
  • 怎样给公司做网站株洲平台公司有几家
  • 医院 网站建设 中企动力微信上建微网站要钱吗
  • 成都网站设计哪家比较好河南app手机网站制作
  • 德阳网站建设ghxhwl不用js做网站
  • 动态手机网站怎么做南宁网页设计培训机构
  • 河南郑州网站推广优化音乐网站建设成本
  • 模板建站可以做优化吗企业形象网站开发
  • 网站美工做图推荐揭阳城乡建设局网站
  • wordpress搭建网站有什么好外兴安盟网站建设
  • wap网站预览部门网站建设怎么做
  • 如何做电子海报在网站ppt设计培训班