【校内模拟】【18-10-16】长者 【主席树】【哈希】
(拖更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】长者 【主席树】【哈希】相关推荐
- 【NOIP校内模拟】T3 长者(主席树+哈希+二分)
我们先考虑如何比较两两的字符串 我们可以用线段树来维护哈希值 在线段树上根据二分的性质来做即可 又考虑到 每颗线段树是在之前的某颗基础上只修改了一个节点 那显然就想到了主席树 另外说说如何pushup ...
- CF464E The Classic Problem(主席树+哈希+最短路)
CF464E The Classic Problem problem solution code problem 题目链接 solution 经典题. 本题很特别的是每条边的边权都是 222 的幂,而 ...
- 【NOIP校内模拟】T2 华莱士(环套树)
其实就是要求最小的环套树森林 我们现在只考虑如何合并 设当前边的两个端点是x,y 若x,y在一个联通块里 那这个联通块要么是树 要么是环套树 假如是个环套树 加一条边后必定变成两个环 不符合要求 假如 ...
- 【2018/10/16测试T3】长者
[题目] 内网传送门 外网传送门 [分析] 30 pts:哈希+二分 可以用 s t r i n g string string 排序,也可以利用哈希做到 O ( l o g n ) (log\ ...
- 2018.10.16【校内模拟】长者(主席树)(字符串哈希)
解析: 其实题目已经提示了我们需要用什么数据结构 没睡醒的zxyoizxyoizxyoi考场上打了30pts30pts30pts暴力就直接滚粗了... 一听是正解主席树瞬间明白怎么做... 由于每次修 ...
- 2018.10.16 NOIP模拟 长者(主席树+hash)
传送门 考试的时候开始sb的以为需要可持久化trietrietrie树,发现建树时空都是O(n2)O(n^2)O(n2)的. 然后发现由于每次只从原来的字符串改一个字符. 因此直接主席树维护区间has ...
- csp-s模拟测试49(9.22)养花(分块/主席树)·折射(神仙DP)·画作
最近有点头晕........... T1 养花 考场我没想到正解,后来打的主席树,对于每个摸数查找1-(k-1),k-(2k-1)...的最大值,事实上还是很容易被卡的但是没有数据好像还比较友善, 对 ...
- CodeForces - 916D Jamie and To-do List(主席树+模拟)
题目链接:点击查看 题目大意:模拟实现 nnn 次操作,每次操作共有四种类型: setaixiset \ a_i \ x_iset ai xi:设置 aia_iai 的优先级为 xix_ixi ...
- 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...
1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...
最新文章
- 厉害了!不重启JVM,替换掉已经加载的类
- c++ 将输入存储到数组,然后反转数组,最后输出
- 浅谈ios设计之使用表格UITableVIew设计通讯录的方法
- angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现
- oracle 查询cpu 100%,Oracle 11g中查询CPU占有率高的SQL
- 一行Python代码就可以下载任意网站视频,零基础小白也能轻松学会
- (92)Verilog HDL系统函数和任务:$fclose
- Python基于用户协同过滤算法电影推荐的一个小改进
- 台式计算机内存是什么问题,台式电脑提示内存不足怎么回事
- 陕西西咸新区沣西新城大数据产业发展思考
- 小米10 twrp刷入开发版
- 深度摄像头:一:深度了解深度摄像头
- windows主机和虚拟机设置桥接
- L2-009 抢红包 排序+模拟
- Error creating bean with name ‘dataSource‘: Error setting property,river for test database type [HSQ
- norflash 分析
- 百度360搜索关键字
- 从苏宁电器到卡巴斯基第21篇:单证这一年(上)
- LigerUI —— 表格树的使用
- 如何使用计算机cct证考试系统,计算机cct考试
热门文章
- 稚晖君刚拿了百度投资,估值被曝已超独角兽!
- 【jzoj1481】偷懒的西西
- FFmpeg 从零开始开发简单的音视频播放器(一)
- K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间
- C语言中的结束符‘\0‘
- 损失上千万,赚了一个亿,解密拼多多事件背后隐藏的阴谋!
- Java 自定义类加载器教程
- 基础——ARM系统的启动流程(boot loader,Linux 内核,文件系统之间的关系)
- 同济大学核心学术刊物基本目录_同济大学:《装配式混凝土结构连接节点构造》图集解读,值得收藏...
- 小程序蓝牙模块教程--小程序走过的坑(12)(最新版)