数列编辑器,在线IDE

本期的主题是洛谷的在线IDE

小学生?!小学生虐我

思路:

怎么说链表也是可以的吧,虽然比较繁琐

然后涉及到了前缀和和一些优化手段(应该可以说是记忆化吧)?

用p记录光标的位置

虽然这道题的数据范围挺大的(1~1,000,000)

但是题目中说,k一定在p之前

所以实际上只有p前面的序列是有效的

于是我们就可以写一个半在线半离线的算法

链表模拟数列

当然了,不用按照顺序,我们只用把数字存一下,然后顺序什么的一切靠链表解决

f数组 存i点(这里的i不是数列中的顺序,而是实际读入的顺序,下同,具体见代码)的最大前缀和,这样就可以直接查询

s数组 存i点的前缀和,方便更新f数组

然后用 ord数组 记录一下每个数在数列中的编号(不是实际的编号,有点类似hash的样子)

每接受一个操作就做一次更新

代码如下:

#include<bits/stdc++.h>
#define INF 0x7f7f7f7f
using namespace std;
struct node{
int f,t;//f表示前驱,t表示后继(由于本菜鸟不喜欢front和next……请谅解~)
int s;
}b[1000010];
int T,t,p,n;
int s[1000010];
int f[1000010];
int ord[1000010];
int read()//有负数,快读不要忘记符号的问题
{
int s=0,p=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')
p=-1;
c=getchar();
}
while(isdigit(c))
{
s=(s<<1)+(s<<3)+c-'0';
c=getchar();
}
return s*p;
}
int main()
{
char c;
T=read();
f[0]=-INF;//因为有负数嘛,所以一开始前缀和的最大值应该是一个极小数
while(T--)
{
c=getchar();
while(c!='I'&&c!='D'&&c!='L'&&c!='R'&&c!='Q')
c=getchar();//getchar()比较快(优化后还有更快的),写c=='\n'||c=='\r'||c==' ',关系也不大
if(c=='I')
{
b[++t].s=read();
b[t].f=p;
b[b[p].t].f=t;
b[t].t=b[p].t;
b[p].t=t;
s[t]=s[p]+b[t].s;//插入节点
f[t]=max(f[p],s[t]);//更新当前的前缀和最大值
p=t;//更新光标位置
ord[++n]=p;//加入有价值的数列,并hash一下编号
}
if(c=='D')
{
b[b[p].t].f=b[p].f;
b[b[p].f].t=b[p].t;//删除节点
p=b[p].f;
n--;
}
if(c=='L')
{
p=b[p].f;
n--;
}
if(c=='R')
{
s[b[p].t]=s[p]+b[b[p].t].s;
f[b[p].t]=max(f[p],s[b[p].t]);
p=b[p].t;
ord[++n]=p;
}
if(c=='Q')
printf("%d\n",f[ord[read()]]);//这里可以好好理解一下
}//其实这里的五个操作可以合并起来写,放在函数里,然后可以调用
//比如说在'I'的操作里,可以看成是插入一个节点,然后在右移光标一位 这两步
//比较方便(其实也没方便多少)
return 0;
}

最后,再支持一下Luogu的

在线IDE!

极大解决Linux系统和Windows系统造成的差异问题,那些恶心优秀的字符类模拟题就再也不用方了

「Luogu P2201」数列编辑器 解题报告的更多相关文章

  1. 「Luogu P2278」[HNOI2003]操作系统 解题报告

    题面 一道模拟题,模拟CPU的处理过程?!省选模拟题 思路: 模拟退火大法+优先队列乱搞 要注意的点 1.空闲时,CPU要处理进程 2.当队列中没有进程时,要先进行判断,然后访问 3.当优先级高的进程 ...

  2. 「Luogu P3183」[HAOI2016]食物链 解题报告

    身为一个蒟蒻,由于刷不过[NOI2001]食物链 于是出门左转写了道另一道假的食物链 戳这里 这里的食物链个条数其实就是有向图的路径数(应该是这么说吧,我弱) 思路: 拓扑(Topulogy)(一本正 ...

  3. 「THUSCH 2017」大魔法师 解题报告

    「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...

  4. 「CTS2019 | CTSC2019」随机立方体 解题报告

    「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...

  5. 「BZOJ4510」「Usaco2016 Jan」Radio Contact 解题报告

    无线电联系 Radio Contact 题目描述 Farmer John has lost his favorite cow bell, and Bessie the cow has agreed t ...

  6. 「Luogu P3866」[TJOI2009]战争游戏 解题报告

    题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...

  7. 「Luogu P2015」二叉苹果树 解题报告

    题面 一个二叉树,边数为n\((2<n\le 100)\),每条边有一个权值,求剪枝后剩下p\((1<p<n)\)条边,使p条边的权值和最大 还看不懂?-- 2 5 input:5 ...

  8. 「Luogu P2508」[HAOI2008]圆上的整点 解题报告

    题面 给定圆的半径,求圆上整点数 这是一道很Nice的数学题!超爱!好吧,由于这道题,我去Study了一下复数(complex number)复杂的数 真棒!!! 有兴趣的戳这里!!!\(\huge ...

  9. 「Luogu P1210」回文检测 解题报告

    题面 这是一道诡异的黄题 居然让你求一串吧啦吧啦的东西中 字母(大小写)最长的回文串的长度,还要输出完整的串 吐血 思路: 保持淡定,我们啥都不会,就会Manacher,那就用Manacher大法! ...

随机推荐

  1. behavior planning——14.implement a cost function in C++

    n most situations, a single cost function will not be sufficient to produce complex vehicle behavior ...

  2. Android Studio(二):快捷键设置、插件安装

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  3. H3C PPP MP配置示例二

  4. 为什么有的文件从SVN上更新不下来

    前几天使用eclipse的插件从SVN上更新代码,将全部的代码更新下来后启动项目,前台报错说有些js文件找不到,后来检查我的工程里确实没有那些文件,经过检查发现SVN上却有这些文件,那为什么更新不下来 ...

  5. H3C 多路径网络中环路产生过程(3)

  6. H3C IP地址拒绝及释放

  7. linux一个例子驱动

    我们介绍的驱动称为 short (Simple Hardware Operations and Raw Tests). 所有它做 的是读和写几个 8-位 端口, 从你在加载时选择的开始. 缺省地, 它 ...

  8. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(9)之系统登录

    前面我们已经做好了一个文章管理功能模块,接下来,我们回头来做登录窗口,登录不仅涉及到登录验证还涉及到登录日志还有缓存时长等. 对于缓存的相关设置,我们已经写好封装在Bobo.Utilities.dll ...

  9. 读《Effect Java中文版》

    读<Effect Java中文版> 译者序 序 前言 第1章引言 1   第2章创建和销毁对象 4 第1条:考虑用静态工厂方法代替构造函数 4 第2条:使用私有构造函数强化singleto ...

  10. oracle 包 简单使用

    理解PL/SQL包 简介 包(package)的主要作用是用于逻辑组合相关的PL/SQL类型 比如记录类型或者集合类型,PL/SQL游标或游标声明以及PL/SQL子程序 还可以包含任何可以在块的声明区 ...