摘要: 首先分析一下题目,对于这棵树,操作如下: 查询从 X 到 Y 的路径上的前 k 大的值。 把 $P_i$ 上的武力值减去一个 $F_i$ 并在 Y 上的武力值加上一个 $F_i$,再把 $P_i$ 改成 Y。 将 $P_i$ 上的武力值减去一个 $F_i$ 再加上一个 Y,并把 $F_i$ 改成 Y 阅读全文
posted @ 2024-02-17 20:49 睡不醒的凪 阅读(27) 评论(0) 推荐(0)
摘要: 首先找最大公共子序列,可以轻松想到 $O(n^2)$ 的 dp 转移式子,$f_{i,j}=max\begin{cases}f_{i-1,j}&i>0\ f_{i,j-1}&j>0\ f_{i-1,j-1}+1&i>0,j>0,A_i=A_j \end{cases}$ 但是我们发现最后 $n\le1 阅读全文
posted @ 2024-02-17 20:48 睡不醒的凪 阅读(18) 评论(0) 推荐(0)
摘要: 先看题目,因为在文中可以发现,它有一个区间加区间减的操作,所以我们想到了线段树和差分,而下面题目是要我们自己查找让所有的数字相同的最小步数。 因此我们可以将线段树排除,那么来看差分,对于差分而言,所有的数字都相同,就可以看作对于所有的 $2\le i \le n$ 而言,$a_i = 0$,最后的结 阅读全文
posted @ 2024-02-17 20:48 睡不醒的凪 阅读(46) 评论(0) 推荐(0)
摘要: 这是一道非常经典的题目。 首先可以想到暴力的算法,一一匹配取最小值,期望时间复杂度为 $O(n^2)$,很明显过不了此题。 所以我们考虑分治,我们每次将所有点按 x 分为两半,然后分治两半,取最小值,然后就可以获取到左右两块内部最小值,那么大范围内的最小值只有左边最小值,右边最小值或者横跨左右的最小 阅读全文
posted @ 2024-02-17 20:48 睡不醒的凪 阅读(11) 评论(0) 推荐(0)
摘要: 看题目可以发现每个点的需求需要看它儿子所需要的值,所以就可以理所当然的想到将所有的点的儿子节点加在一起,然后排序,让大的先处理,所以我们就得到了一分美好的代码。 #include <cstdio> #include <vector> #include <queue> using namespace 阅读全文
posted @ 2024-02-17 20:47 睡不醒的凪 阅读(12) 评论(0) 推荐(0)
摘要: 首先讲讲 st 表。这个东西呢,就是一种利用了倍增思想的预处理数据从而达到快速查询的功能。 for (int i = 1;i <= n; ++ i) scanf ("%d", &f[i][0]); for (int i = 1;i < 21; ++ i) { int t1 = 1 << i - 1, 阅读全文
posted @ 2024-02-17 20:47 睡不醒的凪 阅读(23) 评论(0) 推荐(0)
摘要: 这个题目,可以看出每一个盘里的水往下流出的路径会是一样的,而且没有修改操作,所以我们可以预处理出每个盘里往下的路径,已经要下去所需要的水。 那么首先需要寻找每个盘往下的第一个盘是那个。对于盘 i 来说,第一个盘 j 应满足 $j>i &&D_j>D_i$,所以就可以想到用单调栈处理每个盘下第一盘。 阅读全文
posted @ 2024-02-17 20:47 睡不醒的凪 阅读(23) 评论(0) 推荐(0)
摘要: 前置芝士——二叉搜索树 BST 简介 二叉搜索树是一种二叉树的树形数据结构,其定义如下: 空树是二叉搜索树。 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二叉搜索树的左右子树均为二叉搜索树 阅读全文
posted @ 2024-02-17 20:46 睡不醒的凪 阅读(17) 评论(0) 推荐(0)
摘要: 本人写 blog 纯属无聊瞎整,主要写给自己看,不喜勿喷。 (๑•̀ㅂ•́)و✧ 阅读全文
posted @ 2024-02-17 20:45 睡不醒的凪 阅读(6) 评论(0) 推荐(0)
摘要: 平衡树 前置芝士——二叉搜索树 BST 简介 二叉搜索树是一种二叉树的树形数据结构,其定义如下: 空树是二叉搜索树。 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二叉搜索树的左右子树均为二叉搜索树 阅读全文
posted @ 2023-12-11 19:49 睡不醒的凪 阅读(13) 评论(0) 推荐(0)