数列编辑器,在线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系统造成的差异问题,那些恶心优秀的字符类模拟题就再也不用方了

转载于:https://www.cnblogs.com/hovny/p/10130751.html

「Luogu P2201」数列编辑器 解题报告相关推荐

  1. LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告

    LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告 前置知识:闭区间上的连续函数的零点存在性定理: 我们定义这样的函数: 定义域为 [ l , r ] ∩ Z [l,r]\cap ...

  2. 「分块系列」数列分块入门3 解题报告

    数列分块入门3 题意概括 区间加法,区间求前驱. 写在前面 这题的方法与分块2方法极其类似,建议自行解决. 正题 和上一题类似,但是二分不是用来计数的,而是用来求小于c的最大值的.然后对于不完整快,将 ...

  3. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  4. 「SDOI2014」数数 解题报告

    「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串. 例如当 \(S=(\)22, 333, 0 ...

  5. tyvj P2018 「Nescafé26」小猫爬山 解题报告

    P2018 「Nescafé26」小猫爬山 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经 ...

  6. 「JLOI2015」战争调度 解题报告

    「JLOI2015」战争调度 感觉一到晚上大脑就宕机了... 题目本身不难,就算没接触过想想也是可以想到的 这个满二叉树的深度很浅啊,每个点只会和它的\(n-1\)个祖先匹配啊 于是可以暴力枚举祖先链 ...

  7. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  8. 「CH2101」可达性统计 解题报告

    CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到 ...

  9. 「洛谷P3469」[POI2008]BLO-Blockade 解题报告

    P3469[POI2008]LO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个 ...

最新文章

  1. php正则引用不能计算,php正则表达式 后向引用~
  2. Vue开发规范1.0
  3. 销售订单行项目的装运点字段确认规则
  4. 源代码的下载和编译:
  5. 编程之美2014 热身赛 题目3 : 树上的三角形
  6. Win Form不能响应键盘事件
  7. Spring定时器技术终结者——采用XML配置的方式实现Spring定时器
  8. 电脑怎么开护眼模式_心累!整天对着手机电脑,到底该怎么护眼啊啊啊
  9. vue路由钩子函数(进入和离开钩子函数)
  10. 利用简单电阻分压原理自动测量电阻
  11. C语言 用指针 逆序存放数组
  12. 介绍现有三大前端框架-思想
  13. 「凹凸数据」历史文章合集,更新中
  14. 为何泽塔云GPU云能做到“云端的图形工作站,本地一致的使用体验”?
  15. 幼儿园监控_透明装饰_安全工地_放心食堂_多媒体教室基于视频流媒体能力解决方案
  16. i++和++i的区别
  17. js两个二维数组合并并去除相同项(整理)
  18. webstorm配置Prettier
  19. Educational Codeforces Round 124 (Rated for Div. 2)D. Nearest Excluded Points
  20. Oceanus的实时流式计算实践与优化

热门文章

  1. 一件事情没弄清楚,十有八九做不好
  2. es6+angular1.X+webpack 实现按路由功能打包项目
  3. java 导出excel学习小片段
  4. Revit API多选多重过滤
  5. python文件内容倒序_python实现对列表中的元素进行倒序打印
  6. iphone分辨率_AppStore今日推荐 iphone放大分辨率减少白噪点的照片处理工具
  7. python网络爬虫的流程图_基于Python的网络爬虫的设计与实现
  8. 软件测试经典面试题(一)给你一个水杯如何测试
  9. Connectivity Matrices(连通矩阵)
  10. 恒丰银行年报:以区块链等线上“大脑”再造业务流程