(拖更N天终于想起来我还有博客 )
(校内模拟的题面&代码联赛后解除封印~)

题解

1.0 这次是正经的分析

把题目概括一下,进行认真分析,我们可以依次得到以下信息(由浅至深):

1.考虑骗分

我们需要一个数据结构,随时支持查询某个版本的信息,并能在更改后进行存储。

方法:直接开二维数组进行模拟。
缺点:因为有数据范围的限制,只能拿到30分。
提示:我们需要一个好的方法来同时维护多个不同版本,同时又不能占用太多空间。

2.进一步思考

每个版本之间的差距一般情况下并不会特别大,因而我们只需要维护那些修改的地方就可以了。

方法:我在考场上想到的是用点存储修改的信息,并且把它连向它的父节点,最后我们会得到一张放射状的图,根节点是最初版本,四周延伸的是各个不同版本。
缺点:有可能这些点会连成一条长链,也有可能被修改的最多的版本并不是最初版本,两者都可能让每次更新花费O(N)的复杂度。
提示:因为问题主要出在根节点上,所以这道题多半会用到某些与树相关的数据结构

3.分析数据点

第三个数据点非常特殊,如果你顺着第②步的思路画一张图,你会发现这是一棵二叉树。这意味着对于每一个版本,它们最多有logn个地方不一样。

方法:快排比较logn个不同的地方。
缺点:无。但仍不能够得到满分。
提示:和第②步类似:如果使用树形结构维护信息,就可以在log的时间内完成版本更新。

综上所述:维护历史版本,新增版本,树形结构。

具有以上特点的,毫无疑问就是主席树了。(不愧是长者 )

1.1 正解

既然想到了主席树,我们就来考虑怎样用主席树实现这一过程。

这里要说到的就是常规套路之一——哈希+二分

建树的步骤与主席树的常规套路是一样的,不过,我们还要用每个节点维护当前区间的哈希值,那么当我们最后对每个版本进行字典序排序时,就可以利用线段树自带二分的性质找到第一个不同的地方。举个例子:

对于 abccaaac 和 abbcaaac:
1.比较左右儿子的哈希值, abcc!=abbc,说明不同的地方在前半段,所以我们走左儿子,
2.重复上一步骤 ,ab==ab,说明前半段是相同的,后半段不同,所以我们走右儿子
3.重复上一步骤, c!=b,走左儿子
4.已经到了叶节点,返回c和b的大小关系

这样一来,我们就在log的时间内找到了第一个不同点。据此,我们手写一个cmp函数,在建树完成过后用一个sort就可以得到最终的答案了。

总结

这道题我在考场上分析了很久,最后也的确证明了我的猜想的确是正确的。(只可惜我不会写主席树 )那么回顾我的推理过程,主要是从数据范围和部分分值两方面进行考虑的。

我们并不能保证每一次都能拿到满分,尤其是面对比较难的题,经常连思路都没有。这个时候我们就应该着眼于数据点和数据范围,通过这些推导出大概的时间复杂度和思考方向。

举一些例子:

当我们看到二、三位数以内的数据范围,会想到n2甚至是n3的算法,一般会是动态规划。

当我们看到六、七位数以内的数据范围,会考虑nlogn或者是nlog2n的算法,比如最短路问题。

当数据规模达到九位数甚至是超过int范围,我们首先得开long long,其次就是考虑log级别的算法了,比如快速幂、二分查找等等。

如果每一次都能把题目分析透彻,找准思路,那么即使拿不到满分,如果真的能拿到该拿的部分分,也已经是一个不错的成绩了。

【校内模拟】【18-10-16】长者 【主席树】【哈希】相关推荐

  1. 【NOIP校内模拟】T3 长者(主席树+哈希+二分)

    我们先考虑如何比较两两的字符串 我们可以用线段树来维护哈希值 在线段树上根据二分的性质来做即可 又考虑到 每颗线段树是在之前的某颗基础上只修改了一个节点 那显然就想到了主席树 另外说说如何pushup ...

  2. CF464E The Classic Problem(主席树+哈希+最短路)

    CF464E The Classic Problem problem solution code problem 题目链接 solution 经典题. 本题很特别的是每条边的边权都是 222 的幂,而 ...

  3. 【NOIP校内模拟】T2 华莱士(环套树)

    其实就是要求最小的环套树森林 我们现在只考虑如何合并 设当前边的两个端点是x,y 若x,y在一个联通块里 那这个联通块要么是树 要么是环套树 假如是个环套树 加一条边后必定变成两个环 不符合要求 假如 ...

  4. 【2018/10/16测试T3】长者

    [题目] 内网传送门 外网传送门 [分析] 30 pts:哈希+二分 可以用 s t r i n g string string 排序,也可以利用哈希做到 O ( l o g    n ) (log\ ...

  5. 2018.10.16【校内模拟】长者(主席树)(字符串哈希)

    解析: 其实题目已经提示了我们需要用什么数据结构 没睡醒的zxyoizxyoizxyoi考场上打了30pts30pts30pts暴力就直接滚粗了... 一听是正解主席树瞬间明白怎么做... 由于每次修 ...

  6. 2018.10.16 NOIP模拟 长者(主席树+hash)

    传送门 考试的时候开始sb的以为需要可持久化trietrietrie树,发现建树时空都是O(n2)O(n^2)O(n2)的. 然后发现由于每次只从原来的字符串改一个字符. 因此直接主席树维护区间has ...

  7. csp-s模拟测试49(9.22)养花(分块/主席树)·折射(神仙DP)·画作

    最近有点头晕........... T1 养花 考场我没想到正解,后来打的主席树,对于每个摸数查找1-(k-1),k-(2k-1)...的最大值,事实上还是很容易被卡的但是没有数据好像还比较友善, 对 ...

  8. CodeForces - 916D Jamie and To-do List(主席树+模拟)

    题目链接:点击查看 题目大意:模拟实现 nnn 次操作,每次操作共有四种类型: setaixiset \ a_i \ x_iset ai​ xi​:设置 aia_iai​ 的优先级为 xix_ixi​ ...

  9. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...

    1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...

最新文章

  1. 厉害了!不重启JVM,替换掉已经加载的类
  2. c++ 将输入存储到数组,然后反转数组,最后输出
  3. 浅谈ios设计之使用表格UITableVIew设计通讯录的方法
  4. angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现
  5. oracle 查询cpu 100%,Oracle 11g中查询CPU占有率高的SQL
  6. 一行Python代码就可以下载任意网站视频,零基础小白也能轻松学会
  7. (92)Verilog HDL系统函数和任务:$fclose
  8. Python基于用户协同过滤算法电影推荐的一个小改进
  9. 台式计算机内存是什么问题,台式电脑提示内存不足怎么回事
  10. 陕西西咸新区沣西新城大数据产业发展思考
  11. 小米10 twrp刷入开发版
  12. 深度摄像头:一:深度了解深度摄像头
  13. windows主机和虚拟机设置桥接
  14. L2-009 抢红包 排序+模拟
  15. Error creating bean with name ‘dataSource‘: Error setting property,river for test database type [HSQ
  16. norflash 分析
  17. 百度360搜索关键字
  18. 从苏宁电器到卡巴斯基第21篇:单证这一年(上)
  19. LigerUI —— 表格树的使用
  20. 如何使用计算机cct证考试系统,计算机cct考试

热门文章

  1. 稚晖君刚拿了百度投资,估值被曝已超独角兽!
  2. 【jzoj1481】偷懒的西西
  3. FFmpeg 从零开始开发简单的音视频播放器(一)
  4. K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间
  5. C语言中的结束符‘\0‘
  6. 损失上千万,赚了一个亿,解密拼多多事件背后隐藏的阴谋!
  7. Java 自定义类加载器教程
  8. 基础——ARM系统的启动流程(boot loader,Linux 内核,文件系统之间的关系)
  9. 同济大学核心学术刊物基本目录_同济大学:《装配式混凝土结构连接节点构造》图集解读,值得收藏...
  10. 小程序蓝牙模块教程--小程序走过的坑(12)(最新版)