OI笔录

博主详细记录了OI学习的过程,涉及并查集、堆、BM、KMP、Trie、AC自动机等多个算法和数据结构。通过实例和总结加深理解,如AC自动机与动态规划、矩阵快速幂等的结合,以及RMQ、LCA、树链剖分、线段树的应用。此外,还学习了平衡树(Treap、Splay)和点分治、LCT等高级数据结构。
摘要由CSDN通过智能技术生成

二月一日 并查集+堆

看了并查集、堆和左偏树(还有树状数组?)。

一、并查集
并查集之前预习和总结了一点点,所以看起来比较顺畅。
将并查集的一些重难点标记了,做了一道扩展里面的题目(因为不知道怎么存图搜了题解,然后搞了一下午把跟着道题并查集没有什么关系的维护弄懂了。。。但是思路在那里,之后琢磨即可)

二、堆
这也是熟人了。。但是代码并不好打(口胡很爽一写代码就离谱)。写了lrj的轮廓线,然后调得差不多了,因为codevs版本跟本地描述不一样,所以改着改着炸了。

话说例题的题目是个古董题,做过两遍了吧。。就没做了:)(毫不夸张的笑容)

三、可并堆(左偏树)
理解了思路,还没写代码。好长的论文。。

二月2日 BM & KMP & TRIE & AUTO_AC

看到19点终于把“1.模板学习”看完了。。。
想吐槽一下为什么这么杂。。而且不像昨天一样有推荐学习顺序(这个有利有弊,但利大于弊)。虽然在反复横跳的情况下把上面四个东西都看完了,但是扩展KMP真的迷了。

话说有了“1.模板学习”,应该不用“2.专项突破”了,特别是Hash资料的几个优化,有点鸡肋(而且看!不!懂!),总体来说1.比2.还高效一些,因为2.里面有的1.里面基本都有,而且2.很让人摸不着头。

开始看例题了。今天肝了一道Trie树,然后抄了抄AC自动机(挺好理解但是怎么就和动态规划啊,矩阵快速幂啊,图论啊,概率啊挂上了呢???wtlkh)。
明天看能不能把AC自动机中的三个应用肝出来(概率放弃了0.O)。。。

Febr,3rd——AUTO_AC

AC自动机本身不难,但是他可以和很多奇奇怪怪的东西结合,这就很让人不爽了。但是这一类题目很容易看出算法,因为“有多个子串”是明示AC自动机。

1.动态规划。
一般问长度为n的字符串中若不能出现m个子串的情况下最少修改几个字符。设状态dp[i][j]为前i个字符到达状态j。

2.矩阵快速幂。
一般问在长度为n的字符串中不出现m个长度不超过L的子串的情况下有多少种方案。(复杂度为L^3*n)

其实动态规划的n如果变成10^18,也可以用矩阵快速幂来做。

然后,我就被踩了。那个转移我搞了很久才懂,脑子一直卡住了。
换了一个博客,发现了了不得的事,我把状态看错了。。。然后一下子就懂了。
注意:AC自动机在建的时候fail指针数组和next数组有时并不完全独立。不同的问题需要的信息不同。

CF86C(AC自动机、DP)

题意:构造一个长度为n的字符串,在总共m个子串中选择,构造的字符串中的每一个字符都需要有子串提供,求构成的方案。
AC自动机有这样一个特性,停留在深度较大的节点时候可以继续拥有当前串所有更短后缀的信息,因为可以沿着fail指针寻找其后缀。我们走fail时会使当前子串剩余0~len-1长度后缀的状态都转移到最深的点上,而转移之后我们丢失了当前状态的已经匹配的长度的信息,所以新增一维状态表示当前串还剩多少没有匹配,在这个树下面会有匹配的项。匹配上就转移到0,否则转移到未匹配+1(son是在跳fail)

2.4 RMQ / LCA / 树链剖分 / 线段树

看了如题。了解了RMQ和LCA的实现和转化;知道了逆操作的思想,如Lost cows和Buy tickets两道题。

RMQ的两种实现方法:ST树和ST表。
LCA的两种实现方法:寻找最深公共根路径节点和寻找最浅最短路径节点。
然后根据这两个性质就可以用tarjan算法将LCA问题变成RMQ问题。

今天的内容在以前的基础上更有提高,
对数据结构的认识,决不能局限于功能上,也要看到它的弊端,这才是做数据结构题及时打开和切换思路的秘诀。
(ppt上对线段树的理解实在透彻,可以好好钻研,难怪都说中国选手擅长数据结构)

二月五日 RMQ & LCA / 树链剖分 / 线段树

1.其实是重链剖分,用到了树链剖分的思想。选取最深的节点作为重链,维护DFS序使其链上节点序号连续,子树由于DFS序的性质也是连续的。然后就可以用线段树维护区间和。

2.tarjan算法的实现,就是DFS序的性质。

3.并查集和树状数组实现Kth问题。并查集维护组大小,树状数组维护组数。

4.线段树的应用,也要注意不同情况操作略微不同。

the K-th largest group (并查集、树状数组)

并查集+树状数组的妙用之在线第k大。
将C数组的下标和权值的意义分别改成表示组内键值数量,组数。
查询第k大的时候转换成第k小,然后枚举ans的二进制位,找到一个∑C[1…ans]小于k,此时ans+1这个下标就是第k大的组的组数。

2/6/2020 线段树 / 树状数组 ----- 共 & 异

线段树的应用,注意基本操作之间的差异。

1.重点:拆分与合并信息。分析怎么把当前区间的问题拆分到左右子区间,新增维护的量;分析如何合并两个区间,考虑边界与否。

2.线段树维护DP值。一般树状数组也行。

3.一般来说虽然线段树常数大,但是用来处理修改和查询的结合的题目比较直观。

4.RMQ问题只能用线段树。

树状数组的应用,注意下标与键值的意义。

1.重点:如上。

2.可以用于第k小,逆序对。

3.树状数组更容易提高维度。

捉迷藏(线段树)

括号序列也可以和路径边数联系起来。进入子树前加左括号,回溯后加右括号,相当于把子树括起来。在DFS序中,两棵子树合并时去掉匹配括号剩下的就是路径数。那么维护最远的两个点就是求最长括号序列,然后单点修改区间维护就可以用线段树了。

2-7-2020 平衡树(划掉)treap

今天很惨。。/ll
[上午]状态不错,把平衡树都看完了。然后。。。决定手打无旋treap。。
[下午]就过去了。。然后。。。决定调对无旋treap。。
[晚上]就差不多结束了。。调到十点多。突然发现自己今天只写了一道题(treap,无旋treap,可持久化treap)

不过还是有东西可以写的。
我把上午的知识点提炼都写在纸上,然后仔细的对比了一下,下午再“实战演练”。。收获挺大的。
pdf上只写了按照size来split的,但模板应该按键值(天真的我都打了一次)。
然后merge可以直接返回L或R(方便些),也可以传引用。
然后ins很简单。。
del注意只删一个,而无旋treap不支持count,所以把v都提出来,去掉一个,再合并。(并不知道是不是因为数据水,全删也行)
split。。。这个传参思维难度有、大,特别是传引用,但是经过一下午的画图终于弄懂了(splay最懵逼/ll)。
rank和kth,注意边界,要知道split将等于v的分给L还是R。
pre和sur,同上!啊,没了
不对,还有reverse,这个就推标记。实现把左右儿子换一下就行。
pd在所有要改变树形态的操作前;pu在之后。

splay好像和蔼一些(除了背板子)。

今天大概就这个亚子了,睡觉。。

元宵节AnKang 平衡树(划掉)splay

本来打算看树链剖分和LCT的。然后被DFS例题的可持久化搞蒙了。

于是我又。。调了一天splay。

不过总算把门道都搞清楚了。

  1. splay有两种写法(怎么怪怪的= =?)
    1. 一种是(x,y),将x移到y的下方。
    2. 一种是移到root,然后设置为root。(这就是上面的特殊情况而已,不过这样可以保证树高和方便前缀后缀查询)
  2. rotate。今天都打得我打着打着打错了了。就很常规操作更新关系就好了。
  3. ins & del。这个就可以count了。记得ins后要splay。
  4. pre & sur。while到底。
  5. reverse。 转到左子树的右子树,打标记。

没了。

自从进了平衡树,什么代码都按kb算。。

抛开奇怪的毒瘤题不谈,个人觉得树链剖分是思路最清晰的。重链剖分是两次过的。

庚子年二月九日 点分治 & LCT

淀粉质和树链剖分都好善良/ll

(我没保存电脑关机了[裂开]。。我的markdown没了。。)

算了,重写。。

LCT -Link Cut Tree - 动态树

久闻其名。果然是个难肝的数据结构,最基本的操作:access。其实也好理解【只是理解】(一定要多画图),四步操作循环到根即可。

需要注意的是pushdown,即关于reverse的处理。一般需要将儿子也转一下。

点分治和树链剖分都比较手生,需要再暴力手打几遍。。

然后树分治和LCT应该重新再学一下,好像还没有什么手感。

点分治模板

淀粉质好东西!主要流程:
1.找重心,比较经典的两个数组是size和count,记录子树大小和整棵树大小,然后根据其最大子树和剩余部分最大值的最小值来确定重心。
2.递归统计答案。这里用到的思想是容斥原理。将经过根的加上,再枚举儿子减去重复部分。
3.计算函数。DFS序将子树遍历,求出所需要的数据。注意清零。

2.11 考试总结

还是犯了老错误,没有安排好时间,不会取舍。

本来想试试自己码力,结果忘了using namespace std;,死活急不出来。。只好手打了个个堆,耗了一个多小时。

Hash本来map很快写完了,但是不甘心拿30分,就一直死磕这个Hash。。但事实证明没写过没有总结过,完全不知道自己错哪里。

就这样,今天两三个小时就耗在了一些不必要的错误上面。

唉,老毛病改改吧。

2.12 考试总结

本来今天心情不错的,然后第一题。

(读题ing)??(自动理解)这有点像某道买进卖出的题,堆?还要在树上??

这怎么分治???LCA???不可能啊【完全忘记看完题目】

然后第一题卡了。

第二题。每次向后面追加一个字符。。。(随便加那个?)哦!统计点数奇偶然后&¥%#*@……【完全不知道看错题目】

第三题。模板!(……)写完了。哈哈!

心不静下来,怎么做题!

然而,第一题其实很简单(看懂之后)。

第二题其实不简单(看清楚之后)。

奇怪。。

越来越不在状态了,还是停下来做做常规调整一下吧。

P.S:我怎么感觉好多知识点都是套路。。

2.14 考试总结

今天状态不错,但是做题的时候还是有一点急躁。

就拿第二题来说。明明是最先想到正解的题目,却一直到最后又是因为一个自认为绝对没有错的错误给K.O了。上次也是,急忙之中打了一个STL堆,结果连>=都没有想清楚。

第一题一开始以为只能莫队,而且是我不会的带修莫队做,所以就跳过了。

但是后面又回来看第一题。终于被T<=30的数据范围点醒了其实还是玄学记忆突现

然后在lsq的帮助下过了#4。(这也提醒了我只要出题人故意不小心没讲的,都要特判一下)

虽然垫底了……¥%@#¥|&

不过我觉得自己状态好多了,因为思路很清晰,基本上代码只需要写一遍改一点手误就能运行了,虽然今天早上差点睡过头

PS:我终于找到导出了。。

2.15 考试总结

IOI杀我。

第一题原题还是打了好久,线段树根本不会调。眼睛看花……

不过最后还是弄出来了。

T2一开始想到了维护方法,但是一看数据范围就傻了。离散化根本就不熟,只好想用线段树写暴力,发现这题线段树暴力复杂度跟正解差不多,最后直接一个优美纯暴力过了52pts,终于拿到了大众分。

T3其实我一下子就有了思路,想到了LCA,最后用并查集实现但是没时间了。最后提交都没按到。

策略问题策略问题。(思维题多好拒绝套路题讨厌硬核数据结构题

2.16 考试总结

IOI \text{IOI} IOI杀我 × 2 \times2 ×2

点分治细节很多,码量很大,对于手残党很不友好,而且三道题的侧重点不同,让我想了很久才下手。

明明觉得是对的但是改不出来,点分治就是一个贼玄学的东西。

特别是T2,感觉答案不会大于n所以写的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值