把单调栈的题目总结在一起吧QAQ——记得加上这个分组的上一篇(第一篇
bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int M=50007; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,h[M],v[M]; int st[M],top,s[M],ans; int main() { n=read(); for(int i=1;i<=n;i++) h[i]=read(),v[i]=read(); for(int i=1;i<=n;i++){ while(top&&h[st[top]]<h[i]) s[i]+=v[st[top--]]; st[++top]=i; } top=0; for(int i=n;i;i--){ while(top&&h[st[top]]<h[i]) s[i]+=v[st[top--]]; st[++top]=i; } for(int i=1;i<=n;i++) ans=max(ans,s[i]); printf("%d ",ans); return 0; }
bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define LL long long using namespace std; const int M=1e5+7; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int h[M],n; LL ans; int st[M],top; int main() { n=read(); for(int i=1;i<=n;i++) h[i]=read(); for(int i=1;i<=n;i++){ while(top&&h[st[top]]<=h[i]) top--; ans+=top; st[++top]=i; }printf("%lld ",ans); return 0; }
bzoj 1345: [Baltic2007]序列问题Sequence
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define LL long long using namespace std; const int M=1e5+7,inf=0x7f7f7f7f; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,st[M],top; LL ans,k; int main() { n=read(); st[0]=inf; for(int i=1;i<=n;i++){ k=read(); while(top&&st[top]<=k){ if(k<st[top-1]) ans+=k; else ans+=st[top-1]; top--; } st[++top]=k; } while(top>1) ans+=st[--top]; printf("%lld ",ans); return 0; }