随笔分类 - 数据结构 - 树状数组
摘要:题目大意:给定一个二元组集合A{}, 一个三元组集合B{}, 定义 C 为 A 和 B 在 {b = e} 上的连接,求 C 集合中凸点的个数,即:最值点的个数。 题解: C 为一个三元组集合,求凸点的个数问题等价于三维偏序问题,去重之后可以直接计算。 不过,发现若直接暴力进行连接运算,最坏情况下会
阅读全文
摘要:题目大意:给定一个序列,初始为空。现在我们将 1 到 N 的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少? 题解:学会了 rope 操作。 由于是从小到大插入元素,发现当前插入 i 时,对前 i 1 个元素的答案没有影响,即:后续插入
阅读全文
摘要:题目大意:给定一个长度为 N 的序列,M 个操作,支持区间加,区间查询最大公约数。 题解: 先来看一个子问题,若是单点修改,区间最大公约数,则可以发现,每次修改最多改变 $O(logn)$ 个答案,且 gcd 可以合并,因此可以直接在线段树上维护。 但是对于区间加来说,无法在已知区间加了某一个数时快
阅读全文
摘要:题目大意:给定一个长度为 N 的序列,M 个询问,每次询问区间逆序对的个数。 题解:用树状数组加速答案转移。 代码如下 cpp include define fi first define se second define pb push_back define mp make_pair defin
阅读全文
摘要:题目大意:给定一个长度为 N 的序列,给定常数 t,求有多少个区间 [l,r] 满足 $\sum\limits_{i=l}^{r}a_i define fi first define se second define pb push_back define mp make_pair define a
阅读全文
摘要:题目大意:给定一个长度为 N 的序列,求有多少个三元组满足 $i define fi first define se second define pb push_back define mp make_pair define all(x) x.begin(),x.end() using namesp
阅读全文
摘要:题目大意:静态统计序列区间中出现次数大于等于 2 的颜色数。 题解:类似于 "HH的项链" ,只需将 i 和 pre[i] 的关系对应到 pre[i] 和 pre[pre[i]] 的关系即可。 代码如下 cpp include using namespace std; const int maxn=
阅读全文
摘要:题目大意:静态查询序列区间颜色数。 题解:对于一个查询区间 [l , r] ,若有两个相同颜色的点在这个区间中,则总是取下标靠近端点 r 的颜色计入答案贡献。对于每个下标,记录下在这个下标之前,且距离当前下标最近的,且与这个下标对应的颜色相同的下标是多少,即:$min\{j,j using name
阅读全文
摘要:题目大意:维护 N M 个点,每个点有三个权值,支持单点修改,查询矩形区间内权值等于某个值的点的个数。 题解:矩阵可以看成两个维度,权值为第三个维度,为一个三维偏序维护问题。发现第三维仅仅为单点修改和单点询问,直接用数组实现最简单,且空间足够。因此,直接建立 100 个二维树状数组,转变成为单点修改
阅读全文
摘要:题目大意:给定一个长度为 N 的序列,从序列中任意挑出三个数,求满足中间的数字值最小(最大)有多少种情况。 题解:建立在值域上的树状数组,从左到右扫描一遍序列,统计出每个点左边有多少个数大于(小于)该点的值,再从右到左扫描一遍序列,统计出每个点右边有多少个数大于(小于)自己,最后计算答案贡献即可。
阅读全文
摘要:题中给出了第 i 头牛前面有多少比它矮,如果正着分析比较难找到规律。因此,采用倒着分析的方法(最后一头牛的rank可以直接得出),对于第 i 头牛来说,它的rank值为没有被占用的rank集合中的第A[i]+1大数。所以,采用树状数组维护0 1序列(表示是否被占用)的前缀和,每次再用二分得出第K大数
阅读全文

浙公网安备 33010602011771号