代码仓库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;
}