随笔分类 - 树形数据结构—线段树合并
摘要:题意 "题目链接" Sol 首先不难想到一个dp,设$f[i][j]$表示$i$的子树内选择的最小值至少为$j$的最大个数 转移的时候维护一个后缀$mx$然后直接加 因为后缀max是单调不升的,那么我们可以维护他的差分数组(两个差分数组相加再求和 与 对两个原数组直接求和是一样的) 向上合并的过程中
阅读全文
摘要:题意 "题目链接" Sol 神仙题Orz 后缀自动机 + 线段树合并 首先对所有的$t_i$建个广义后缀自动机,这样可以得到所有子串信息。 考虑把询问离线,然后把$S$拿到自动机上跑,同时维护一下最长能匹配的位置,对于每个以$i$位置为右端点的询问我们需要找到$len$最小的状态满足$len[sta
阅读全文
摘要:题意 "题目链接" Sol 线段树合并板子题,目前我看到两种写法,分别是这样的。 前一种每次需要新建一个节点,空间是$O(4nlogn)$ 后者不需要新建,空间是$O(nlogn)$(面向数据算空间你懂得),但是需要离线,因为共用节点的缘故,之后的修改可能会修改到不需要修改的节点(好绕啊); 这题就
阅读全文
摘要:题意 "题目链接" Sol 线段树合并板子题 cpp include using namespace std; const int MAXN = 400000, SS = MAXN 21; inline int read() { char c = getchar(); int x = 0, f =
阅读全文
摘要:题意 "题目链接" Sol 线段树合并~~为什么我会在这个时候学这种东西~~ 就是暴力合并两棵线段树(必须动态开节点),遇到空节点就返回 可以证明,对于$m$个仅有一个元素,权值范围在$[1, n]$的线段树合并的复杂度为$mlogn$ 对于此题来说,显然子树内与子树外互不影响,因此暴力判断一下翻转
阅读全文