数列编辑器 【NOIP2016提高A组模拟9.14】

题目

这里写图片描述
样例输入:
这里写图片描述
8
I 2
I -1
I 1
Q 3
L
D
R
Q 2

样例输出:
这里写图片描述
2
3
样例解释:
这里写图片描述

数据范围:
这里写图片描述


剖解题目

。。。。。。


思路

一脸懵逼的望着,还在想怎么用线段树搞插入之类的。。。。。
然而竟然只是个链表。。。。


解法

对于15%:segement tree||BIT可以解决。
对于后面的75%:暴力即可。
100%:链表处理,维护每个点的前驱和后驱,搞一搞就可以了。


代码

#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)

using namespace std;

const int maxn=1e6+5;
int le[maxn],ri[maxn],num,n,lg,a[maxn],sum[maxn],mx[maxn],pos[maxn];
bool bz[maxn];

int main()
{
    //freopen("T2.in","r",stdin); 
    //freopen("T.out","w",stdout);
    scanf("%d",&n);
    mx[0]=-1e9;
    ri[0]=n+1;
    fo(i,1,n){
        char ch;
        scanf("%s",&ch);
        if (ch=='I') {
            int x;
            scanf("%d",&x);
            ri[++num]=ri[lg]; le[ri[lg]]=num;
            ri[lg]=num; le[num]=lg; 
            a[num]=x; lg=num;
            pos[lg]=pos[le[lg]]+1;
            sum[lg]=sum[le[lg]]+a[lg];
            mx[pos[lg]]=max(mx[pos[le[lg]]],sum[lg]);
        }
        else if (ch=='D'){
            int hg=lg; 
            lg=le[lg]; 
            ri[le[hg]]=ri[hg];
            le[ri[hg]]=le[hg];
            pos[ri[lg]]=pos[lg]+1;
        }
        else if (ch=='L') lg=le[lg];
        else if (ch=='R') {
            if (ri[lg]!=n+1) {
                lg=ri[lg];
                pos[lg]=pos[le[lg]]+1;
                sum[lg]=sum[le[lg]]+a[lg];
                mx[pos[lg]]=max(mx[pos[le[lg]]],sum[lg]);
            }
        }
        else {
            int x;
            scanf("%d",&x);
            printf("%d\n",mx[x]);
        }
    }
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值