【JZOJ4778】数列编辑器

本文介绍了一种使用双向链表实现文本编辑器的方法,并详细解释了如何通过维护前缀和来快速响应用户的各种操作指令,包括插入、删除、左移、右移及查询指定位置的累积值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

这里写图片描述

Solution

只要发现询问的k是在光标前,这题就没有问题了。

剩下的就是用双向链表维护,维护前缀和即可。

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define N 1000100
#define ll long long
using namespace std;
int a[N],nx[N],ls[N],num=0;
ll s[N],sm[N];
int b[N];
int main()
{
    freopen("editor.in","r",stdin);
    freopen("editor.out","w",stdout);
    int Q;
    cin>>Q;
    int c=0,p=0;
    nx[0]=N-99;
    ls[N-99]=0;
    ls[0]=-1;
    b[0]=0;
    sm[0]=-2147483647;
    while(Q--)
    {
        char ch[3];
        int x;
        scanf("%s",ch);
        if(ch[0]=='I')
        {
            scanf("%d",&x);
            a[++num]=x;
            ls[nx[p]]=num;
            nx[num]=nx[p];
            nx[p]=num;
            ls[num]=p;
            b[num]=b[ls[num]]+1;
            p=nx[p];
            int t=b[p];
            s[t]=s[t-1]+x;
            sm[t]=max(sm[t-1],s[t]);
        }
        else if(ch[0]=='D')
        {
            ls[nx[p]]=ls[p];
            nx[ls[p]]=nx[p];
            p=ls[p];
        }
        else if(ch[0]=='L')
        {
             if(ls[p]!=-1) p=ls[p];
        }
        else if(ch[0]=='R')
        {
            if(nx[p]!=N-99)
            {
                p=nx[p];
                b[p]=b[ls[p]]+1;
                int t=b[p];
                s[t]=s[t-1]+a[p];
                sm[t]=max(sm[t-1],s[t]);
            }
        }
        else
        {
            scanf("%d",&x);
            printf("%d\n",sm[x]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值