栈专题练习
Posted autoint
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈专题练习相关的知识,希望对你有一定的参考价值。
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
",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;
}
以上是关于栈专题练习的主要内容,如果未能解决你的问题,请参考以下文章