多校十 Hdu 4699

来源:互联网 发布:滨江淘宝摄影基地在哪 编辑:程序博客网 时间:2024/05/16 15:57

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


原创粉丝点击