多校十 Hdu 4699

终于AC了。。

今天赛场上一直看这题,一直坚信用树状数组做,然后写了一发,一直TLE,没办法,确实没法优化。。只好放弃

赛后看解题报告,

栈A, B维护光标之前(之后)的序列
I x A.push(x)
D A.pop()
L B.push(A.pop())
R A.push(B.pop())
▶ 对于栈A 中的每个元素,额外维护前缀和,以及前缀和的
最大值

然后很信任的开了两个栈,写了好久,交一发,RE了!手动开栈WA了!肯定还有错,我发现只用栈是不可以的,因为题目问的是1-k之间找最大值,我的栈尾不一定就是第K个,唉~很傻逼的想要是栈可以直接取第k个元素就可以了,想到这,突然发现要取第k个元素,那么就用vector吧!vector 模拟栈。。

用vector写完了,然后交一发WA!!,天呀,不甘心,后面一直再检查,才发现那个光标位置出了一点错,改了一下A!!

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <stack>
//#pragma comment(linker, "/STACK:10240000000,10240000000")//手动加桟---外挂
using namespace std;
const int M=1000005;
struct node
{
    int v;
    int sum;
    int maxsum;
};
vector<node>A,B;
//stack<node>A,B;//之前的栈
int main()
{
    int t,k,s;
    char a[3];
    while(scanf("%d",&t)!=EOF)
    {
        A.clear();
        B.clear();
        while(t--)
        {
            scanf("%s",a);
            if(a[0]=='I')
            {
                scanf("%d",&s);
                node next;
                next.sum=s;
                next.v=s;
                next.maxsum=s;
                if(A.size()>0)
                {
                    node cur=A.back();
                    next.sum=cur.sum+next.v;
                    next.maxsum=max(cur.maxsum,next.sum);
                    A.push_back(next);
                }
                else
                {
                    A.push_back(next);
                }
            }
            else if(a[0]=='L')
            {
                if(A.size()>0)
                {
                    node cur=A.back();
                    B.push_back(cur);
                    A.pop_back();
                    if(A.size()>0)//没判A空时就WA了
                    {
                        node vv= A.back();
                        A.pop_back();
                        vv.sum=cur.sum-cur.v;
                        vv.maxsum=max(vv.sum,vv.maxsum);
                        A.push_back(vv);
                    }
                }
            }
            else if(a[0]=='R')
            {
                if(B.size()>0)
                {
                    if(A.size()>0)
                    {
                        node cur=A.back();
                        node next=B.back();
                        //B.pop();
                        B.pop_back();
                        next.sum=cur.sum+next.v;
                        next.maxsum=max(cur.maxsum,next.sum);
                        A.push_back(next);
                    }
                    else
                    {
                        node next=B.back();
                        B.pop_back();
                        next.sum=next.v;
                        next.maxsum=next.v;
                        A.push_back(next);
                    }
                }
            }
            else if(a[0]=='D')
            {
                if(A.size()>0)
                {
                    node vv=A.back();
                    A.pop_back();
                    if(A.size())
                    {
                        node cur=A.back();
                        A.pop_back();
                        cur.sum=vv.sum-vv.v;
                        cur.maxsum=max(cur.maxsum,cur.sum);
                        A.push_back(cur);
                    }
                }
            }
            else if(a[0]=='Q')
            {
                scanf("%d",&k);
                printf("%d\n",A[k-1].maxsum);
            }
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值