题目大意:
模拟光标动作
输入个N,代表有N个动作
动作共有5个
I x:代表在光标之后插入x
D:删除在光标之前的元素
L:将光标向左移动一位除非光标在最开头
R:将光标向右移动一位除非光标在末尾
Q k:代表求出max{S1,S2.......Sk}, Sk=1+2+....+k;
思路:
用双栈,一个用来记录光标左边元素记为L,一个用来记右边元素记为R,如果向左移则L出栈R入栈,若右移则R出栈L入栈。- -我做出来后才想到是栈的感觉所以这里用了VECTOR。。
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
struct node
{
int sum;
int m;
int v;
}next,cur;
vector<node>a,b;
int main()
{
int num,j,n;
char k;
while(scanf("%d",&num)!=EOF)
{
a.clear();
b.clear();
while(num--)
{
getchar();
scanf("%c",&k);
if(k=='I')
{
scanf("%d",&n);
next.m=n;
next.v=n;
next.sum=n;
if(a.size()==0)
a.push_back(next);
else
{
int sz=a.size();
cur=a[sz-1];
next.sum = cur.sum + next.v;
next.m = max(next.sum,cur.m);
a.push_back(next);
}
}
else if(k=='L')
{
int sz = a.size() ;
if(sz)
{
cur = a[sz-1] ;
a.pop_back();
b.push_back(cur);
}
}
else if(k=='R')
{
j = b.size();
if(j)
{
next=b[j-1];
b.pop_back();
next.sum=next.v;
next.m=next.v;
int sz = a.size();
if(sz==0)
{
next.sum=next.v;
next.m=next.v;
a.push_back(next);
}
else
{
cur = a[sz-1];
next.sum = cur.sum + next.v;
next.m = max(next.sum,cur.m);
a.push_back(next);
}
}
}
else if(k=='D')
{
if(a.size())
a.pop_back();
}
else if(k=='Q')
{
scanf("%d",&n);
printf("%d\n",a[n-1].m);
}
}
}
return 0;
}