栈专题练习

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;
}

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

时间: 2024-10-15 19:31:50

栈专题练习的相关文章

七方件业金离以提领前群约会ODjdidtlwfWv

为了从不同环节,尤其与广大使用人群直接关系的环节反映质量状况,对共享自行车投放点.运营仓库.生产企业等不同环节的产品抽查,覆盖了共享自行车从成品出厂到待投放的关键环节. 该负责人称,根据新车投放情况,结合共享自行车行业市场占有分布特点,本次重点抽查了摩拜.ofo.Hellobike三个品牌的产品,占本次抽查批次总数的83.3%.其中,在天津.无锡.武汉.广州.深圳.东莞6个城市抽查了9批次摩拜产品,占产品抽查批次总数的37.5%,抽查批次合格率88.9%,抽查不合格的1批次产品为待投放于广州市的

买《Python Web全栈工程师》专题视频课程送纸质图书

经过一年多时间的呕心沥血,Python立体化图书--<Python从小白到大牛>即将与大家见面了.所谓立体化图书包括:电子图书.视频.课件和服务等内容. <Python从小白到大牛>纸质图书将于10月上旬上市,为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院<Python Web全栈工程师>专题视频课程的学员送一本<Python从小白到大牛>纸质版图书.请于购买课程后10个工作日内申请赠书,过期视为放弃.注意:苹果支付购买,以及打折活动购买不

买《Java Web全栈工程师之路》专题视频课程送纸质图书

<Java从小白到大牛>上市一年来,取得了比较好的成绩. 为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院<Java Web全栈工程师之路>专题视频课程的学员送一本<Java从小白到大牛>纸质版图书.请于购买课程后10个工作日内申请赠书,过期视为放弃.注意:苹果支付购买,以及8折(含8折)一下活动购买不赠送图书.领取说明:加qq群:51CTO-关老师付费群 523714201 验证消息:用户名+订单号即可通过. 最好您在购买之前咨询客服人员,以免不符合赠

栈与队列专题

1.定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 方法:1.使用两个栈 stackData,stackMin,一个记录数据,另一个栈确保栈顶是当前数据栈的最小元素 2.入栈:若stackMin空,则直接入,否则如果当前元素小于等于栈顶元素,入栈,否则,不入. 3.出栈:如果从stackData出来的元素于当前stackMin元素栈顶相同,stackMin进行一次出栈. private Stack<Integer> stack=new Stack<>();

数据结构专题 ——栈的应用 A1051.Pop Sequence(25)

解法1:(自己码的) #include <bits/stdc++.h> #include<math.h> #include <string> using namespace std; const int MAXN = 10000; stack<int> stk; int main(){ int M,N,K; scanf("%d%d%d",&M,&N,&K); int temp[N]; bool flag; int

[专题一] 栈和队列

栈的应用 单调栈 // 常见模型:找出每个数左边离它最近的比它大/小的数 int tt = 0; for (int i = 1; i <= n; i ++ ) { while (tt && check(stk[tt], i)) tt -- ; stk[ ++ tt] = i; } 深搜模版 boolean DFS(Node cur, Node target, Set<Node> visited) { return true if cur is target; for (n

动态分配内存专题

我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗??既然有人会问这样的问题,那么我在这里好好的讲解一下吧!首先让我们熟悉一下计算机的内存吧!在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数):2)字符常量区:主要是储存一些字符常量,比如:char *p_str="cgat";其中"cgat"就储存在字符常量区里面:3)全局区:在全

[你必须知道的NOSQL系列]专题二:Redis快速入门

一.前言 在前一篇博文介绍了MongoDB基本操作,本来打算这篇博文继续介绍MongoDB的相关内容的,例如索引,主从备份等内容的,但是发现这些内容都可以通过官方文档都可以看到,并且都非常详细,所以这里就不想继续介绍了,需要用到的朋友到官方文档进行查阅:http://docs.mongodb.org/manual/tutorial/remove-indexes/.本专题将介绍另一个NoSQL——Redis的相关内容. 二.Redis介绍 关于Redis大家肯定多多少少都有所了解,Redis一般都

2014 UESTC暑前集训数据结构专题解题报告

A.Islands 这种联通块的问题一看就知道是并查集的思想. 做法:从高水位到低水位依序进行操作,这样每次都有新的块浮出水面,可以在前面的基础上进行合并集合的操作.给每个位置分配一个数字,方便合并集合.同时将这些数字也排一个序,降低枚举的复杂度.合并集合时向四周查询浮出水面但是没有合并到同一集合的点进行合并. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath&