• AtCoder Grand Contest 005【A栈模拟,B单调栈】


    挖草,AtCoder实在是太吊了~
    %%%,目前只A了两题;
    A题:
    就是利用栈模拟一下就好了;S进栈,T的话有S就出栈,然后len减一下就好了;

    #include <bits/stdc++.h>
    using namespace std;
    
    char s[200020];
    stack<int>q;
    
    int main()
    {
        scanf("%s",s+1);
        int len=strlen(s+1);
        int ans=0;
        for(int i=1;i<=len;i++)
        {
            if(s[i]=='S')
            {
                q.push(1);
            }
            else
            {
                if(!q.empty())
                {
                    ans+=2;
                    q.pop();
                }
            }
        }
        printf("%d
    ",len-ans);
        return 0;
    }

    B题【单调栈】
    题意:
    简单粗暴:
    就是求所有区间的最小值之和
    思路:
    对于a[i]找他的对于区间的贡献,利用单调栈可以降低复杂度求得前面多少个比他大num1,后面多少个比他大num2,然后贡献就是区间长度*a[i];

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    
    const int N=2e5+10;
    
    struct asd{
        LL pre;
        LL num;
        LL next;
        LL k;
    };
    stack<asd>q;
    
    LL t[N];
    int n;
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lld",&t[i]);
        LL ans=0;
        asd tmp;
        tmp.num=t[1];
        tmp.pre=tmp.next=1;
        tmp.k=1;
        q.push(tmp);
        LL x=0,y=0;
        for(LL i=2;i<=n;i++)
        {
            asd tmp1;
            tmp1.num=t[i];
            tmp1.pre=tmp1.next=1;
            tmp1.k=i;
            while(!q.empty()&&tmp1.num<=q.top().num)//如果说这个元素是小于栈顶的,那么它里面的栈就要被更新,这个元素的pre也要被更新
            {
                tmp=q.top();
                q.pop();
                if(!q.empty())
                    q.top().next+=tmp.next;
                tmp1.pre+=tmp.pre;
                ans+=tmp.pre*tmp.next*tmp.num;
            }
            q.push(tmp1);
        }
        while(!q.empty())
        {
            tmp=q.top();
            q.pop();
            if(!q.empty())
                q.top().next+=tmp.next;
            ans+=tmp.num*tmp.next*tmp.pre;
        }
        printf("%lld
    ",ans);
    }
  • 相关阅读:
    javascript 数组去重
    自动补全多标签输入, 适合新闻标签/商品标签
    一个不错的定位API网站
    pkill killall kill pidof
    topas top vmstat
    grep使用多个查询条件--或
    lsof
    Java 内存区域和GC机制-java概念理解
    Linux下的文件查找类命令(转载)
    centerOS安装rkhunter
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934745.html
Copyright © 2020-2023  润新知