11.24~25数据结构题解及总结

版权声明:myjs999原创文章<br>禁止转载(从2019.2.6 19:51 Beijing, China) https://blog.csdn.net/myjs999/article/details/78639186

题面见OwenOwl的博客

以下是每道题:


第一天

HDRF

注意到在删除完一个子树前不会删除其他的子树。

于是可以递归处理这个问题,对于当前根节点,找到子树中最小的节点,再以该节点为根递归。

每次递归完成后,整个子树会被删除,因此每个节点最多被递归到一次,即复杂度为n·k,k为每次找最小节点的复杂度。

找子树中最小节点显然就是维护dfs序,可以用线段树维护。删除就是把节点的值设为inf。

Shortest Path Queries

10^5询问区间且高度只有10,考虑用一维线段树完成。考虑维护左右端点对应列的每一对点的最短路(相当于开100棵线段树),l=r时显然每条路径都是0。考虑如何合并。

从左端点对应列到右端点对应列的一条路径必然经过中间列。因此以所有中间列的点为起点跑dijkstra,在讨论一下那条路最短就可以了。复杂度nlog2n。

子树直径

首先,两棵树合并时,直径要么过连边要么不过。不过连边的时候直径不变,过连边就向两侧分别找最长链,端点一定是原来的直径中的某个端点。那么新的直径一定是又原来的四个端点中的两个组成的?

Common Ancestor

考虑两棵子树?

Coprime Queries

转化为区间询问倍数问题。查询答案时确定区间左端点的位置?

动态背包

显然就是可持久化数据结构。

奇数读书图

偶数个点的联通块一定符合要求?


第二天

Matrix Recurrence

化简一下式子,发现就是要维护矩阵积,并且每个元素只会入队出队一次。

入队很方便,直接乘。出队难以实现。

对于这种问题,通常可以用AB站来解决。入队时,将元素压入B站。出队时,如果A站没有元素,就把B站O(n)倒序压入A站,然后弹栈。如果有元素就直接弹栈。

把元素压入A站时,维护一个前缀(栈底元素到当前元素)积。查询答案就是B站所有元素的积乘上A站栈顶元素的前缀积(不能每次重新计算整个A站,否则会爆炸)。

Fold

注意到模拟的时间复杂度会退化收敛,长度一直在减少。于是模拟就好了。

退化有时是难以发现的,但其实多推一推就可以。雅礼某一天的区间求mod也是这个原理,因为只有单点增加值和区间减少值,因此总的来说值肯定越来越小。

Paper

两个条件限制,显然二分答案。维护每个点向左可以延伸多远,向右可以延伸多远,左右可以延伸多远,用一个主席树维护。复杂度nlog2n不能过。

Median on Binary Tree

维护一下dp值就可以了?

Independent Events

用泰勒展开化简一下式子?发现就是维护每个点的某个表达式的值。推出来以后就简单地用线段树。主要化简比较难。

Welcome to ICPCC Amp 2017

考虑是如何操作的,以及每次究竟取了那些人,再思考一下怎么统计方案数?最后用一个树状数组维护。

Lowest Common Ancestor

发现每次询问是在这个节点到根节点的链上的?

发现询问即差分?

可能可以用树链剖分维护,不是直接树链剖分,其实是用重链的性质。

Longest Path

点分治加某某。

LYKMUL

先挖掘一下性质嘛。

然后就看什么维护。

每道题还不是要具体分析, 又不会考数据结构板。深入理解数据结构就可以了,之后你做省选题只觉得都是智商题和阅读题。

Subsequence Count

先列出转移方程,发现可以用矩阵快速幂优化。


总结:

整体二分我还不太会,二维树状数组/线段树还没有写过,基础的数据结构应是掌握得较牢了。一些基础的方法,如dfs序等,也渐渐强化了。

没有更多推荐了,返回首页