码迷,mamicode.com
首页 > 其他好文 > 详细

栈专题练习

时间:2019-02-18 18:58:26      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:技术   span   ges   clu   turn   使用   最大   mat   while   

HDU4699 Editor

技术图片
使用“对顶栈”,维护一下前缀和和最大前缀和就行了。

时间复杂度\(O(Q)\)

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
    rg T data=0,w=1;
    rg char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(isdigit(ch))
        data=data*10+ch-'0',ch=getchar();
    return data*w;
}
template<class T>il T read(rg T&x){
    return x=read<T>();
}
typedef long long ll;
using namespace std;

co int N=1e6+1;
int s[N],t[N];
int sum[N],f[N]={-1000};
int main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    int q;
    while(~scanf("%d",&q)){
        s[0]=t[0]=0;
        while(q--){
            char opt[2];
            scanf("%s",opt);
            switch(opt[0]){
                case 'I':{
                    s[++s[0]]=read<int>(),sum[s[0]]=s[s[0]]+sum[s[0]-1],f[s[0]]=max(sum[s[0]],f[s[0]-1]);
                    break;
                }
                case 'D':{
                    --s[0];
                    break;
                }
                case 'L':{
                    if(s[0]) t[++t[0]]=s[s[0]--];
                    break;
                }
                case 'R':{
                    if(t[0]) s[++s[0]]=t[t[0]--],sum[s[0]]=s[s[0]]+sum[s[0]-1],f[s[0]]=max(sum[s[0]],f[s[0]-1]);
                    break;
                }
                case 'Q':{
                    printf("%d\n",f[read<int>()]);
                    break;
                }
                default: assert(0);
            }
        }
    }
    return 0;
}

CH1101 火车进栈

dfs模拟即可。要求字典序最小,优先出栈。

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
    rg T data=0,w=1;
    rg char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(isdigit(ch))
        data=data*10+ch-'0',ch=getchar();
    return data*w;
}
template<class T>il T read(rg T&x){
    return x=read<T>();
}
typedef long long ll;
using namespace std;

co int MAX=20;
int n,cnt;
vector<int> v,way;
void dfs(int now){
    if(now>n){
        for(int i=v.size()-1;i>=0;--i)
            way.push_back(v[i]);
        for(int i=0;i<way.size();++i)
            printf("%d",way[i]);
        puts(""),++cnt;
        for(int i=1;i<=v.size();++i)
            way.pop_back();
        return;
    }
    if(v.size()){
        int t=v.back();
        v.pop_back(),way.push_back(t);
        dfs(now);
        if(cnt==MAX) return;
        v.push_back(t),way.pop_back();
    }
    v.push_back(now);
    dfs(now+1);
    if(cnt==MAX) return;
    v.pop_back();
}
int main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    read(n);
    dfs(1);
    return 0;
}

栈专题练习

标签:技术   span   ges   clu   turn   使用   最大   mat   while   

原文地址:https://www.cnblogs.com/autoint/p/10397175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!