Loading

代码仓库3——单调栈

注意:一切问题若去掉无用决策后程单调性,则可以使用单调数据结构求解。
洛谷模板题:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#include<cstdlib>
#include<ctime>
#define dd double
#define ll long long
#define ld long double
#define ull unsigned long long
#define N 5000100
#define M number
using namespace std;

const ll INF=0x3f3f3f3f;

int s[N],head,f[N],n;
ll a[N];

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	
	a[n+1]=INF;
	s[++head]=1;
	
	for(int i=2;i<=n+1;i++){
//		printf("%lld %lld %d\n",a[i],a[s[head]],head);
		if(!head||a[i]<=a[s[head]]) s[++head]=i;
		else{
//			printf("enter\n");
			while(head&&a[s[head]]<a[i]){
//				printf("entr:%lld %lld\n",a[s[head]],a[i]);
				f[s[head]]=i;
//				printf("f:%d %d\n",s[head],f[s[head]]);
				head--;
			}
			s[++head]=i;
		}
//		for(int i=1;i<=n;i++) printf("%d ",f[i]==n+1?1:f[i]);
//		printf("\n");
	}
	for(int i=1;i<=n;i++) printf("%d ",f[i]==n+1?0:f[i]);
	return 0;
}
posted @ 2021-03-01 21:21  hyl天梦  阅读(35)  评论(0编辑  收藏  举报