zoukankan      html  css  js  c++  java
  • Codeforces 547B. Mike and Feet[单调栈/队列]

    这道题用单调递增的单调栈维护每个数能够覆盖的最大区间即可。

    对于   1 2 3 4 5 4 3 2 1 6 这组样例,

    1能够覆盖的最大区间是10,2能够覆盖的最大区间是7,以此类推,我们可以使用单调栈来实现这种操作。

    具体看代码:

    *Code:

    #include<bits/stdc++.h>
    using namespace std;
    int n,l[200005],r[200005],ans[200005],a[200005];
    int stk[200005],top=0;
    void solve(){
        a[n+1]=-1;
        for(int i=1;i<=n+1;i++){
            if(top==0||a[stk[top-1]]<a[i]){
                l[i]=i;
                stk[top++]=i;
            }
            else if(a[stk[top-1]]==a[i]) continue;
            else{
                while(top>0&&a[stk[top-1]]>a[i]){
                    top--;
                    int len=i-l[stk[top]];
                    ans[len]=max(ans[len],a[stk[top]]);
                }
                if(top==0) l[i]=1;
                else l[i]=l[stk[top]];
                stk[top++]=i;
            }
        }
        for(int i=n-1;i>=1;i--){
            ans[i]=max(ans[i],ans[i+1]);
        }
        for(int i=1;i<=n;i++){
            cout<<ans[i]<<' ';
        }
        puts("");
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        solve();
        return 0;
    }

    每次进来一个比栈顶元素大的元素,就把他压入栈中,并把他能覆盖的左边界设置为他的下标位置。 如果遇到一个比栈顶小的,说明前面有一些元素不能覆盖当前元素了,这样就可以得到前面元素覆盖的最远右边界了。(其实也可以用其他数据结构实现,但是单调栈效率更高)

  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/UnderSilenceee/p/7210846.html
Copyright © 2011-2022 走看看