合集-数据结构(ds)
摘要:树状数组学习笔记 树状数组的使用场景:可差分且有结合律的运算符,如 ^ + * 树状数组优点:编码简单,常数小,但思维量较大。 板子: struct B_tree { int c[N]; void clear(){ memset(c,0,sizeof c); } void add(int x,int
阅读全文
摘要:分块学习笔记 分块是基于区间修改和查询的工具。 用一道题来引入: 给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值。 #6277. 数列分块入门 1 这道题如果用暴力来求解的话,需要 \(O(n^2)\) 的时间复杂度,这样我们是不满意的,那怎么办呢?我们想到,如果 \(l=1,r=n
阅读全文
摘要:左偏树学习笔记 左偏树其实就是一个去实现可并堆这个数据结构的工具,其实完全可以用其他的写法,比如说配对堆,二叉堆,斐波那契堆等等,但是左偏树的写法更加常见,且使用起来更加方便,码量也不大。 我们一般可以用一个启发式合并实现 \(O(\log^2 n)\) 的合并,但是这个左偏树可以实现 \(O(\l
阅读全文
摘要:不带删的尺取。 这个技巧其实是一个运用双栈来模拟队列的一个应用,尺取可以理解为一个队列。 其实就是用一个栈来记队头,一个栈来记队尾,每个栈记对应的对应点记每个点的权值或下标,和它所对应栈的前缀。 每一次入栈时直接入栈(队头)更新前缀即可,而出栈时,若栈(队尾)已经空了,这时就应该把队头的栈直接倒着插
阅读全文
摘要:分治及分治优化学习笔记 前言 这里的分治主要将的是普通分治技巧,cdq分治,线段树分治的应用,树上的点分治之类的可能会再开一个专题(主要是现在作者还不会),先把基础打好。 普通分治 分治主要分为两种——最值分治和中点分值,顾名思义,就是一个取一个区间的最大值/最小值,而一个是直接取中间点即可。分治的
阅读全文
摘要:简单的数据结构题,他没有强制在线,我们可以先想离线,这题的离线操作刚好会比在线轻松一点。 这题离线的话有点像二维数点? 很明显,先求出对于每一个 \(i\),\(i\sim r\) 的 mex 是多少,然后对于再加入一个 \(r+1\) 我们的贡献是多少,但是会发现这个东西好像不能很好地用数据结构来
阅读全文
摘要:原题链接 我们知道,这题的观察的情况很特殊,可以从这个角度出发,窥探性质。 假设这个点是哞微子,通过模拟容易分析出第一次观察在原点往右一个单位,第二次观察在原点往左一个单位,接着原点往左两个单位,往右两个单位。 这个性质很好,然后我们很容易知道相邻两个肯定是不同的微子,因为两个不同微子相撞后相邻的还
阅读全文
摘要:看到删边的问题,我们就很自然的想到 tarjan 和 dfs 树,当然这题是用 dfs 树来解决的。 我们建完树之后分为树边和非树边,这里可以分别讨论: 若为树边(\(dep_u<dep_v\)): \(u\) 为根: \(u\) 有三个及以上的儿子,\(+1\)。 有两个儿子,若 \(v\) 不是
阅读全文
摘要:dp 优化题,很好的一道题,有紫的难度。 很容易有一个 \(O(n^2)\) 的时间复杂度,可得到 15pts。 但是这转移很抽象了,明显不能用一般的优化。 由于这个区间肯定是偶数的,所以想到这个转移大概和奇偶有关,枚举到奇数和偶数完全不同,奇数和偶数也不相干。 想到可以分析红蓝对答案的限制来求出答
阅读全文
摘要:令 \(b[i][j]\) 为用 \(b[i]\) 转移 \(j\) 次。 容易想到这题是二分答案题,一个贪心的思想,对于每一个 \(a_i\) ,在 \(b[a[i]][0]\sim b[a[i]][mid]\) 这些点中大于等于 \(a_{i-1}\) 的最小的值即可,时间复杂度应该是 \(O(
阅读全文
摘要:这题其实就是一个 thick 题,知道这个 thick 其实就是大水体了。 像这样的区间排序题,直接排序肯定不行,但是我们发现 01 数组排序很快,可以用线段树来实现 \(O(\log n)\) 的排序时间复杂度,就是区间赋值。 对大于等于这个值的都赋值为 1,其他为 0,若最后 \(a_q=1\)
阅读全文
摘要:前情提要:现在的整体二分已经不独属于 cyt 了!!! 整体二分跟分治很像(好吧就是用分治实现的),而且符合二分的思路。 这个分治需要记 \(l,r,ql,qr\) 分别是二分的上下界和询问的区间。 把在 \([l,mid]\) 的询问拎出来,\([mid+1,r]\) 的询问拎出来,继续二分即可。
阅读全文
摘要:原题链接 非常综合的一道 dp 好题。 先对 \(x\) 排序。 首先可以想到这题的关键的是最大的 \(S\) ,其次是最小的面积。所以这个长度就是最长上升子序列的长度,所选的 \(S\) 也必须是一个 LIS ,像这样选一个 LIS 的题目可以对数据分层,\(f_i\) 是 \(i\) 为右端点的
阅读全文
摘要:因为要求最大异或,可以想到 Trie 树,这里又有一个时间限制,二重限制应该是需要树套树的,这里对每一个商店都建一颗 Trie 树,而总体用一颗线段树维护。但是这里的区间不是前缀的,直接用树套树需要用可持久化,但是不想写怎么办,可以对每一个 Trie 树中的每一个点都打一个时间标记,表示这个点的最晚
阅读全文
摘要:赛时很唐。 可以将删掉改成保留边会好些一点。 靠考虑保留什么点,首先若两个点都大于 \(k\) 肯定是需要保留的,这时再判断有小于等于 \(k\) 的点,如果这两个点尚未联通这条边肯定是要保留的,若这一条联通肯定这一条是不能保留的。 考虑为什么是对的,首先保留的边肯定构成的是若干个联通块,我们需要通
阅读全文
摘要:显然的线段树题目,思考如何利用 \(k\) 较小这个条件,如果 \(k\) 更小一点,比如 \(k=3\) 那这个题就可以 \(2^{k \times 2}\) 的处理 push_up ,具体就是在左边和右边各开一个数组记一下若从左往右或从右往左所经过的状态为 \(st\) 时的最小长度。实现比较简
阅读全文
摘要:李超线段树学习笔记 李超线段树是一个维护一次函数的一种数据结构,通常来优化 dp。 跟线段树的原理是一样的,这里线段树的节点记的是一个线段的整体的最优线段,也就是一般的线段树的永久化标记。 这里讲一下如何区间修改。 如果这个节点不被区间包含,按一般的线段树往下递归。 如果更新的节点比原节点整体优,直
阅读全文
摘要:点分治&动态点分治学习笔记 点分治 在学习点分治之前需要了解中点分治,我们在处理每一个区间的信息之和的时候,需要通过分治的方式快速的解决,时间复杂度是 \(O(n\log n)\) 的,十分优秀。而在树上的问题,我们也可以使用对应的方式,即点分治。而对于一个树上的中点可以理解为树的重点,每次搜索时,
阅读全文
摘要:一个数据结构题。 首先断环成链,发现对一个值修改只是修改了 4 个点,直接单点修改即可。 这里其实所有非零的值都是一样的,只用 0/1 来表示即可。 考虑查询,可以考虑二分最小长度,只要所有距离大于这个长度的这个区间内有符合条件的零串即可。 即我们需要去求一个区间内是否有被 1 包裹的 0 串,使用
阅读全文
摘要:好题好题。 我们先对一个结点 \(u\) 进行分析。 发现能对 \(u\) 产生贡献的所有结点可以构成一个联通分量。 只有经过 \(u\) 才会对 \(u\) 产生贡献。 而我们不可能将一条链上的所有点都扔到 \(u\) 上,这显然不现实,肯定是进行计算,算出来的,而且光一个结点都需要 \(O(n^
阅读全文
摘要:不是很难的题目,代码想清楚了还是不是很麻烦的,赛时想的太麻烦了。 显然有一个 \(O(n^2\log n)\) 的写法,可以得到 46pts。 考虑子任务 6,只有向上和向右的船,相当于相碰的船只能在一条斜线上,我们把处于一条斜线上的点都放在一个容器里面,相邻两个舰队不同的可以相撞,可以使用链表来写
阅读全文
摘要:二进制分组学习笔记 二进制分组,一种将较在线的东西,加一个 \(\log n\) 变成在线的技术。 具体来讲,就是你将元素的个数用二进制表示,比如 \(23 = 2^4 + 2^2 + 2^1 + 2^0\) ,那就有 4 个容器,分别放 16个元素,4个元素,2个元素,1个元素。每一次增加,就往后
阅读全文

浙公网安备 33010602011771号