CF319B Psychos in a Line 单调栈

10 篇文章 0 订阅

原题:http://codeforces.com/problemset/problem/319/B

题解:给一个序列,若该位置的值大于左边就可以将右边吃掉,问要进行多少次这样的操作。可以用单调栈,栈中存两个值,大小和答案。若当前元素大于栈顶元素就弹出,若没有弹出任何元素,就只进行了一次操作,若将栈弹空,则为0,当前的答案为弹出的最大值+1。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,stack[N][2],top,ans;
int main(){
//	freopen("test.in","r",stdin);
	scanf("%d",&n);top=0;ans=0;
	for(int i=1,x;i<=n;i++){
		scanf("%d",&x);int maxm=0;
		while(top && x>stack[top][0])maxm=max(maxm,stack[top][1]), top--;
		stack[++top][0]=x;
		if(top==1) {
			stack[top][1]=0;
		}else stack[top][1]=maxm+1;
		ans=max(ans,stack[top][1]);
	}
	printf("%d\n",ans);
	
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值