随笔分类 -  数据结构

[CF1172E]Nauuo and ODT:Link-Cut Tree
摘要:分析 ~~lxl大毒瘤。~~ 感谢 "Ouuan" 等CNOIER提供了这么好的比赛。 这里只是把官方题解复述一遍,可以直接去看官方题解: "点我" 。 考虑将问题转化为对于每个颜色,求出没有经过这个颜色的节点的路径有多少条,这问题的答案是: $$\sum_{i=1}^{n}(n^2 \sum_{G 阅读全文

posted @ 2019-06-09 18:22 ErkkiErkko 阅读(404) 评论(0) 推荐(0)

[LOJ3046][ZJOI2019]语言:树链的并+线段树合并
摘要:分析 问题显然可以转化为对于每个节点询问所有这个节点的所有链的链并的大小。 考场上我直接通过树剖打标记+树剖线段树维护以$O(n \log^3 n)$的时间复杂度暴力实现了这个过程。(使用LCT或者全局平衡二叉树可以实现$O(n \log^2 n)$的时间复杂度) 考虑如何快速求出链并的大小,有这样 阅读全文

posted @ 2019-05-08 08:16 ErkkiErkko 阅读(336) 评论(0) 推荐(0)

[十二省联考2019]字符串问题:后缀数组+主席树优化建图
摘要:分析 蒟蒻不会$SAM$,只好来一发主席树优化建图的题解。 令$N$为原字符串的长度。首先我们考虑一个最基本的思路,我们发现$A_j$能接在$A_i$后面当且仅当存在一个$B_k$被$A_i$支配且是$A_j$的前缀。考虑建图,如果$A_i$支配$B_j$,那么从$A_i$向$B_j$连一条单向边, 阅读全文

posted @ 2019-04-08 10:11 ErkkiErkko 阅读(408) 评论(0) 推荐(0)

[BZOJ5249][九省联考2018]IIIDX:线段树+贪心
摘要:分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解。 字典序最大有另一种理解方式,就是让越小的数尽量越靠后。 我们从树的根结点出发,从1开始填数,构造出来的一定是一组合法的解。 对于每种相同的数,可以通过线段树上二分逐个确定他们的最优位置,具体细节可以 阅读全文

posted @ 2019-02-27 22:33 ErkkiErkko 阅读(180) 评论(0) 推荐(0)

[CF666E]Forensic Examination:后缀自动机+线段树合并
摘要:分析 用到了两个小套路: 1. 使用线段树合并维护广义后缀自动机的$right$集合。 2. 查询$S[L,R]$在$T$中的出现次数:给$T$建SAM,在上面跑$S$,跑到$R$的时候先判匹配长度是否$\geq R L+1$,如果是则跳parent使$maxlen(x) \geq R L+1$的前 阅读全文

posted @ 2019-02-27 22:27 ErkkiErkko 阅读(188) 评论(0) 推荐(0)

树上最小权链覆盖:可并堆
摘要:题目描述 给出一棵树和若干条直上直下的链,每条链有权值(非负) 用权值和尽量小的链覆盖树上所有的点 $n,m \leq 1e6$ 分析 猫老师课件上的题。 先考虑本问题在链上的形式,即最小权区间覆盖,这个问题有一个经典做法,即使用线段树优化DP。但是我们发现,由于树的形态,这个算法在树上不具有较强的 阅读全文

posted @ 2019-02-15 11:20 ErkkiErkko 阅读(596) 评论(0) 推荐(0)

[BZOJ4237]稻草人:CDQ分治+单调栈
摘要:分析 按$y$排序后CDQ分治,可以发现每个点可以影响的是$x$坐标的一段区间,可以使用扫描线+单调栈,在单调栈上二分即可解决,时间复杂度$O(n \log^2 n)$。 通过归并排序可以显著减小常数。 代码 阅读全文

posted @ 2019-02-14 12:09 ErkkiErkko 阅读(173) 评论(0) 推荐(0)

[THUSC2017]大魔法师:线段树
摘要:分析 在线段树上用$4 \times 4$的矩阵打标记。 代码 cpp include define rin(i,a,b) for(register int i=(a);i=(b); i) define trav(i,a) for(register int i=head[a];i;i=e[i].nx 阅读全文

posted @ 2019-01-20 23:59 ErkkiErkko 阅读(237) 评论(0) 推荐(0)

[THUSC2017]杜老师:bitset+线性基
摘要:算法一(50pts) 分析 有一个很显然的暴力做法,对于区间内的每个数开个bitset,然后暴力分解质因数。如果对于一个数,它的一个质因子的指数是奇数,那么就把bitset的对应位设成$1$。答案就是异或方程组解的个数,也就是$2^{fail}$,$fail$表示向线性基插入失败的数的个数。 代码 阅读全文

posted @ 2019-01-19 12:33 ErkkiErkko 阅读(509) 评论(0) 推荐(1)

[LOJ2289][THUWC2017]在美妙的数学王国中畅游:Link-Cut Tree+泰勒展开
摘要:分析 ~~又有毒瘤出题人把数学题出在树上了。~~ 根据泰勒展开,有: $$e^x=1+\frac{1}{1!}x+\frac{1}{2!}x^2+\frac{1}{3!}x^3+...$$ $$sin(x)=x \frac{1}{3!}x^3+\frac{1}{5!}x^5 ...$$ 然而题目里$ 阅读全文

posted @ 2018-12-27 08:28 ErkkiErkko 阅读(231) 评论(0) 推荐(0)

[CF1093G]Multidimensional Queries:线段树
摘要:分析 非常有趣的一道题。 式子中的绝对值很难处理,但是我们发现: $$\sum_{i=1}^{k}|a_{x,i} a_{y,i}|=\sum_{i=1}^{k}max(a_{x,i} a_{y,i},a_{y,i} a_{x,i})=max\{\sum_{i=1}^{k}c_ia_{x,i} \s 阅读全文

posted @ 2018-12-20 19:43 ErkkiErkko 阅读(307) 评论(2) 推荐(0)

[BZOJ3236][AHOI2013]作业:树套树/莫队+分块
摘要:分析 第一问随便搞,直接说第二问。 令原数列为$seq$,$pre_i$为$seq_i$这个值上一个出现的位置,于是可以简化询问条件为: 1. $l \leq i \leq r$ 2. $a \leq seq_i \leq b$ 3. $pre_i include include include i 阅读全文

posted @ 2018-12-12 12:01 ErkkiErkko 阅读(245) 评论(0) 推荐(1)

C++ STL bitset总结
摘要:基础用法 "C++ Reference" "神犇博客" 余下的就是例题了 "[BZOJ3687]简单题" 考虑$DP$,设$f[i][j]$表示前$i$个元素的算数和为$j$的子集个数,有: $$f[i][j]=f[i 1][j]+f[i 1][j a[i]]$$ 时间复杂度为$O(n\sum a_ 阅读全文

posted @ 2018-12-06 15:56 ErkkiErkko 阅读(496) 评论(0) 推荐(0)

[BZOJ2225][SPOJ2371]LIS2 - Another Longest Increasing Subsequence Problem:CDQ分治+树状数组+DP
摘要:分析 这回试了一下三级标题,不知道效果怎么样? 回到正题,二维最长上升子序列......嗯,~~我会树套树~~。 考虑$CDQ$分治,算法流程: 1. 先递归进入左子区间。 2. 将左,右子区间按$x$排序。 3. 归并处理左右子区间,在过程中使用树状数组加速$DP$。 4. 还原右区间,清空树状数 阅读全文

posted @ 2018-11-27 00:40 ErkkiErkko 阅读(166) 评论(0) 推荐(0)

[BZOJ4817][SDOI2017]树点涂色:Link-Cut Tree+线段树
摘要:分析 与 "[BZOJ3779]重组病毒" 唯一的区别是多了一个链上求实链段数的操作。 因为每条实链的颜色必然不相同且一条实链上不会有两个深度相同的点(好像算法的正确性和第二个条件没什么关系,算了算了),画图分析可得,如果用$dis[x]$表示从$x$到根结点路径上的实链段数,则$x$到$y$路径上 阅读全文

posted @ 2018-11-23 11:41 ErkkiErkko 阅读(220) 评论(0) 推荐(0)

[BZOJ3779]重组病毒:Link-Cut Tree+线段树
摘要:分析 其实其他的题解说的都很清楚了。 一个点出发感染到根结点所花费的时间是路径上虚边的条数+1。 RELEASE相当于$access()$。 RECENTER相当于$makeroot()$。(虽然换根和打通路径的先后顺序不同但仔细想想本质其实是一样的) 所以我们可以通过维护一棵LCT来快速知道哪些结 阅读全文

posted @ 2018-11-22 09:40 ErkkiErkko 阅读(257) 评论(0) 推荐(0)

动态DP总结
摘要:动态DP 何为动态DP? 将画风正常的DP加上修改操作。 举个例子? 给你一个长度为$n$的数列,从中选出一些数,要求选出的数互不相邻,最大化选出的数的和。 考虑DP,状态设计为$f[i][1/0]$表示考虑了前$i$个数,第$i$个数选/不选的最大和。 状态转移方程显然为: $$f[i][0]=m 阅读全文

posted @ 2018-11-22 00:20 ErkkiErkko 阅读(297) 评论(0) 推荐(0)