CF547B.Mike and Feet(单调栈+区间处理)

题目链接:https://vjudge.net/problem/CodeForces-547B
题意:给出n个数,要求求出所有规模大小为1-n的连续子串中的strength的最大值,strength为一个子串中的最小的那个数值
解题思路:
L[i]表示第i个元素的最左边作用范围(左边界)
R[i]表示第i个元素的最右边作用范围(右边界)
如:1 2 3 4 3 2 1 L[4]=3; R[4]=5; L[1]=0; R[1]=n+1=8;
利用的是单调栈(单增)进行处理
分两次分别处理L和R
L处理步骤:从前往后进行入栈,栈中存入下标,1 -> 1 2 -> 1 2 3 -> 1 2 3 4 ->1 2 3 -> 1 2 -> 1
R处理步骤:从后往前进行入栈…

s1.push(1); L[1]=0;
	for(int i=2;i<=n;i++){
		while(!s1.empty()&&a[s1.top()]>=a[i])
			s1.pop();
		if(s1.empty())
			L[i]=0;
		else
			L[i]=s1.top();
		s1.push(i);
	}
	s2.push(n); R[n]=n+1;
	for(int i=n-1;i>=1;i--){
		while(!s2.empty()&&a[s2.top()]>=a[i])
			s2.pop();
		if(s2.empty())
			R[i]=n+1;
		else
			R[i]=s2.top();
		s2.push(i);
	}

处理完L和R数组后,进行ans的计算,
以第i个元素为例,它的作用范围为L[i]+1到R[i]-1,所以该长度为len=R[i]-L[i]-1的最小值一定是a[i]

for(int i=1;i<=n;i++){
		int len=R[i]-L[i]-1;
		ans[len]=max(ans[len],a[i]);
	}

如果一个元素的作用域为len,那么以他为中心的长度为1,2,… ,len的ans最小值都应该是a[i]

for(int i=n-1;i>=1;i--)
		ans[i]=max(ans[i+1],ans[i]);

代码如下:

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int n;
int a[210000];
int L[210000],R[210000];
int ans[210000];
stack<int> s1,s2;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	s1.push(1); L[1]=0;
	for(int i=2;i<=n;i++){
		while(!s1.empty()&&a[s1.top()]>=a[i])
			s1.pop();
		if(s1.empty())
			L[i]=0;
		else
			L[i]=s1.top();
		s1.push(i);
	}
	s2.push(n); R[n]=n+1;
	for(int i=n-1;i>=1;i--){
		while(!s2.empty()&&a[s2.top()]>=a[i])
			s2.pop();
		if(s2.empty())
			R[i]=n+1;
		else
			R[i]=s2.top();
		s2.push(i);
	}
	for(int i=1;i<=n;i++){
		int len=R[i]-L[i]-1;
		ans[len]=max(ans[len],a[i]);
	}
	for(int i=n-1;i>=1;i--)
		ans[i]=max(ans[i+1],ans[i]);
	for(int i=1;i<=n;i++)
		if(i!=n)
		   printf("%d ",ans[i]);
		else
			printf("%d\n",ans[i]);
	return 0;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
项目:– JavaScript 中的患者数据管理系统 患者数据管理系统是为医院开发的 node JS 项目。通过使用此系统,您可以轻松访问患者数据,它具有成本效益,可改善患者护理和数据安全性。不仅如此,它还减少了错误范围。在运行项目之前,您需要下载 node.js。 这个患者数据管理项目包含 javascript、node.js 和 CSS。我们必须让服务器监听端口 3000,并使用 JSON 在客户端和服务器之间交换数据。这个项目会不断询问您有关插件更新的信息,因此请保持互联网畅通。此系统允许您执行 crud 操作。在这里,您是系统的管理员。您还可以添加所需的员工人数。此外,您还可以更新患者记录。该系统功能齐全且功能齐全。 要运行此项目,您需要在计算机上安装NodeJS并使用现代浏览器,例如 Google Chrome、  Mozilla Firefox。ReactJS项目中的此项目可免费下载源代码。有关项目演示,请查看下面的图像滑块。 对于手动安装 1.将主项目文件夹解压到任意目录 2.从 cmd 设置项目目录的路径 3. 输入命令“npm install” 4.完成后输入命令“npm start” 5.现在,您将获得一个 localhost:portnumber,并转到该 URL 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Buyi.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值