- 博客(5)
- 收藏
- 关注
原创 树状数组学习总结
例:lowbit(1) = 1 , lowbit(2)= 2 , lowbit(3) = 1 , lowbit(4)= 4。我们只要一直加前面子树的总和即可,而我们可用n - lowbit(n)跟踪前面子树的位置。其中,c[n]记录 n - lowbit(n) +1 ~ n 的格子之和。然后,我们可以利用lowbit(n)来表示以n为根节点的子树的叶子节点的个数,那么,当我们Cn时,我们要继续把后面的C[n+lowbit(n)]也更新。假如我们要将第二格的格子+2,那么会影响C[2] , C[4]。
2023-11-15 11:48:05
41
1
原创 [洛谷]P2014选课
树状dp和普通dp有何区别呢?其实树状dp就是在一棵树上进行背包问题。因为在题目中多了前后级关系(即先做……),所以我们才要用树的结构类型。应该选择后序遍历,因为后序遍历可以让最后的答案存储在根节点处。(2)存在多棵树:因为如果没有上一级的话会把上一级写作0,所以我们可以把0当作第一级,把几棵树当作0的子树?(3)树的遍历:到底是选择先序遍历还是后序遍历。题目分析:这道题就是一道非常经典的树状dp。(1)树的存储:前向星。
2023-11-06 14:49:16
54
原创 LIS解题反思(贪心+二分答案)
因为选3时,当后面的数字只要大于3我们便可得n+1长度的子序列,相反,选5时后面的数字得大于5才可得n+1长度的子序列。然后,在处理第二种情况时,我们可以很明显地发现dp是一个单调递增的数列,那么我们就可以用二分答案来找到尽可能小的j。那么,我们现在便可以得到一个贪心的方法:我们尽可能地去更新子序列长度为i的序列的结尾的数字,使得该数字尽可能的小。如果a[i] > 目前最长子序列末尾的数,将a[i]添加到该序列末尾,更新最长子序列长度。用dp[i]储存子序列长度为i的序列的结尾的数字。
2023-10-18 11:12:33
87
1
原创 【洛谷】通往奥格瑞玛的道路 解题思路(dijkstra堆优化+二分)及个人反思
那么我们可以先假定最高消费,然后使超过最高消费城市不得通行,在此基础上进行dijkstra操作,来判断此为最高消费时可不可走到终点。若我们按模板进行操作,仅对sin进行dijkstra操作,那么只能保证到达终点的生命值sin损耗最少,而不能保证经过的城市中一次最高消费最小。答案是可以的,对于生命值sin,肯定是到达终点时的损耗越少越好嘛,若仅对于sin,是可以进行dijkstra操作处理的。
2023-10-08 22:05:22
126
2
原创 dijkstra堆优化程序及链式前向星储存有向图模拟
/将更新之后的子节点的dis存入q中找最小。} //重载运算符来构建小顶堆 ,如果要构建维护大顶堆那么改为 return this->dis < x.dis即可。i=e[i].next) // i指的是第几条路。//dis记载路径赋值,to表示子节点,next表示前一个兄弟节点。//x.now指的是现在在处理的点的坐标。// 链式前向星储存有向图。
2023-10-07 19:10:19
87
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人