01 2019 档案

摘要:"传送门" 今天终于找到了一种比较方便好懂的用LCT维护生成树的办法。 以前用mrclr的方法……不是很理解,然后我写在这道题的时候还错了…… 首先先看一下这道题。这很明显就是让我们动态的维护一个最小生成树。不过因为删边的过程很难维护,所以我们改成先把边存起来,之后倒序回加。 一开始我们先用LC 阅读全文
posted @ 2019-01-23 10:54 CaptainLi 阅读(142) 评论(0) 推荐(0) 编辑
摘要:"传送门" 突然发现自己不大会维护位置这种题……学习了一下。 具体的操作还是使用fhqtreap实现。什么split,merge都一样。问题是如何求位置。 首先我们在读入的时候,保存每个节点的权值和下标,并且按照权值进行排序,同时把它插入到一棵fhqtreap中。 之后我们怎么查找一个节 阅读全文
posted @ 2019-01-22 14:54 CaptainLi 阅读(197) 评论(0) 推荐(0) 编辑
摘要:"传送门" 我还是没有逃过在这道题上debug好久的命运…… 我是使用fhqtreap来做的这道题。写的时候写的挺爽的……调的时候真难受。 首先我们先来说说咋做吧。前5个操作对于fhqtreap来说不在话下,只要多打两个标记就可以了。但是如何求最大子段和? 我们一般只会想到一种$O(n) 阅读全文
posted @ 2019-01-22 14:20 CaptainLi 阅读(229) 评论(0) 推荐(0) 编辑
摘要:fhqtreap是个好东西啊!无旋转treap果然是好写,而且还是比较好理解的。 这种数据结构是由神犇fhq发明的。Think functional fhq神犇说,函数式编程的一大特点就是,不修改,只定义。普通的平衡树,无论是treap还是splay,都需要进行旋转来维护树的平衡性 阅读全文
posted @ 2019-01-22 14:03 CaptainLi 阅读(395) 评论(1) 推荐(0) 编辑
摘要:"传送门" 一道非常好的LCT/树剖题。但是像我这样的菜鸡想不到什么有效做法…… 首先我们可以很容易发现,一次如果要在链上连续修改那么肯定是从底向上的一端连续区间。如果我们把每个节点的输入值作为其权值,那么会被连续更改的一定是一端连续的为1或者为2的区间。 那么我们就可以通过维护这个区间来解决这道题 阅读全文
posted @ 2019-01-22 13:19 CaptainLi 阅读(297) 评论(0) 推荐(0) 编辑
摘要:"传送门" 首先吐槽一下……这题还吓唬你。都说了图中没有同色环,还说什么“所有可能从u到v的简单路径”,就一条…… 很显然就是每一种颜色维护一个LCT。因为颜色很少所以多开几棵就行。 有一些要注意的: 1.在修改的时候,首先我们得先找到连接这两个点的边原来是什么颜色的。这个必须是直接相连,因为有可能 阅读全文
posted @ 2019-01-16 11:07 CaptainLi 阅读(109) 评论(0) 推荐(0) 编辑
摘要:"传送门" 这题数据范围贼小……听说可以用各种乱七八糟的暴力随便过去。 其实这题就是找最长公共子串。但是我一直不知道怎么处理加数的情况……今天豁然开朗,直接对每个串做一次差分就好了。 之后就是我们正常的匹配,每次用子树内的值更新节点的值,最后的时候答案取所有节点最小匹配值的最大值+1. 阅读全文
posted @ 2019-01-16 06:34 CaptainLi 阅读(104) 评论(0) 推荐(0) 编辑
摘要:"传送门" 朴素的想法是直接用SAM模拟,但是这样的话每次归并排序会T掉…… 考虑到每次的影响,对于初始的SAM来说,我们每次新加入一个点,那么就会使这个点到t0状态的路径上所有的点全部权值+1,于是我们需要维护路径,同时还需要支持动态插入,那就是LCT了。 于是乎我们需要用LCT来维护SAM 阅读全文
posted @ 2019-01-14 22:53 CaptainLi 阅读(117) 评论(0) 推荐(0) 编辑
摘要:"传送门" 首先很容易想到对于所有的模式串建出广义后缀自动机,之后对于我们每一个要检查的文本串,先在SAM上跑,计算出来每一个位置能匹配到的最远的位置是多少。(就是当前点减去匹配长度) 之后……考虑DP……一开始我的状态设错了,设成了当前位置的最大的L的值,这样我就不知道怎么转移了…… 于是换一个思 阅读全文
posted @ 2019-01-14 22:46 CaptainLi 阅读(180) 评论(0) 推荐(0) 编辑
摘要:"传送门" 这题的字符串匹配搬到了树上……?那不在一条链咋做啊……不会了,凉凉…… 然后丽洁姐姐给我们留了一条生路……就是保证了叶子节点的个数不超过20. 树上任意一条路径,我们总能找到一个叶子节点,使得以它为根的时候这条路径在一条链上。那我们可以把每个叶子节点作为根节点来建立广义后缀自动机,最后直 阅读全文
posted @ 2019-01-12 22:15 CaptainLi 阅读(105) 评论(0) 推荐(0) 编辑
摘要:"传送门" 两个串嘛……可以建广义后缀自动机。 我们每次要记录一下对于每个节点,其对应的在第一个串上的size和第二个串上的size,那么每个节点对于答案的贡献就是size[0]size[1](l[i]l[fa[i]]) 解释一下,size其实表示的就是endpos集合之内的元素个数 ,也 阅读全文
posted @ 2019-01-12 22:06 CaptainLi 阅读(131) 评论(0) 推荐(0) 编辑
摘要:"传送门" 广义后缀自动机…… 其实也不是很难理解,就是每次SAM插入一个串之后,插入新的串的时候,要把last重新调到1的位置,共用一些节点。 这个题我们首先要预处理出来每个状态被多少个串共用。~~挺暴力的~~就是每次把节点染色,如果节点没被染色就给他染一下,然后记录当前节点又被共用了一次。 最后 阅读全文
posted @ 2019-01-12 22:00 CaptainLi 阅读(204) 评论(0) 推荐(0) 编辑
摘要:"传送门" 前一题的加强版……求10个串的最长公共子串的长度。 OI Wiki上的解法我没看懂…… 朴素的想法还是对第一个串建立SAM,之后把后面的串不断地在上面匹配,对于每一个状态记录匹配最小值,所有状态取最大值。不过这样是会WA的…… 为啥呢?因为我们是对于每个状态取最小,然后最后在算答案的时候 阅读全文
posted @ 2019-01-12 21:43 CaptainLi 阅读(218) 评论(0) 推荐(1) 编辑
摘要:"传送门" 求两个字符串最长公共子串的长度。 对于第一个串S,建立SAM,之后对于第二个串T,我们在上面和S进行匹配。首先从t0开始,如果能成功匹配的话,那么我们让长度+1,同时更新答案。如果失配,那我们就跳parent树转移到其父节点的位置,并且把当前匹配长度变为其最长后缀长度即可。 最后统 阅读全文
posted @ 2019-01-12 21:27 CaptainLi 阅读(125) 评论(0) 推荐(0) 编辑
摘要:"传送门" 我一开始的想法是直接去求后面的lcp(Ti,Tj),但是我不会…… 有一条性质:两个后缀的lcp就是他们在parent树上的LCA,而且出题人给这个式子其实是有目的的……我们把式子拆开,对于每一条边,我们赋一个权值为l[i]l[fa[i]],这样的话我们只要求出 阅读全文
posted @ 2019-01-12 21:23 CaptainLi 阅读(142) 评论(0) 推荐(0) 编辑
摘要:"传送门" 对于SAM上的一个状态,我们可以求出这个状态对应着多少子串,这个很好做,我们只要每次统计一下他所有的转移把对应情况加上就好。 我们首先对SAM上的状态进行拓扑排序(虽然说是拓扑排序但是实际上可以用基数排序完成,以每个状态对应的最大后缀长度为关键字)。之后对于情况1,我们在跳parent树 阅读全文
posted @ 2019-01-12 21:18 CaptainLi 阅读(116) 评论(0) 推荐(0) 编辑
摘要:"传送门" 用SAM可以非常轻松的解决问题。 只要把原串向SAM中插入两次,之后直接从t0状态开始每次贪心跑最小就可以了。 因为这个题要用map,所以之前取begin即可。 阅读全文
posted @ 2019-01-12 21:05 CaptainLi 阅读(290) 评论(0) 推荐(0) 编辑
摘要:"传送门" (vjudge和hdu也有但是我觉得LOJ好看!而且限制少!) 不过本题描述有误,应该是k小。 首先我们需要对线性基进行改造。需要把每一位改造成为,包含最高位的能异或出来的最小的数。 为啥呢?因为如果不满足这个条件的话,那么在之后的异或过程中,大的数反而会被小的数异或的更小。 满足了上述 阅读全文
posted @ 2019-01-09 23:33 CaptainLi 阅读(490) 评论(0) 推荐(0) 编辑
摘要:"传送门" 这个题题目描述真怪异……就不能说人话吗…… 人话:给定长为n的序列A,定义f(s)为集合s内所有元素异或值,求A的所有子集的f值从小到大排列后,q在其中第一次出现的下标对10086取模的值。 首先不难想到构建线性基。线性基有一个良好的性质!假设这n个数的线性基中有k的数,那么显然有$2^ 阅读全文
posted @ 2019-01-09 21:57 CaptainLi 阅读(157) 评论(0) 推荐(0) 编辑
摘要:"传送门" 题目要求的就是求一个线性无关的方程组…… 于是学到了一个新的东西,叫实数下的线性基……这个其实和普通的线性基很像。具体做法就是,我们首先把所有物品按价格从小到大排序,之后贪心的先选取价格小的。每次我们遍历其一位属性,如果这一维基底当前为空,就把它压入,否则的话计算它和当前这一维基底的比值 阅读全文
posted @ 2019-01-09 21:07 CaptainLi 阅读(111) 评论(0) 推荐(0) 编辑
摘要:"传送门" 如果只是一条路径的话,那就是非常简单的线性基。 不过要考虑多组询问…… 考虑到n比较小,我们可以模仿倍增LCA的方法,预处理倍增的线性基。在每次路径上跳的时候把线性基合并最后求解即可。具体的做法是,我们用p[i][x][j]表示在编号为x的点处,向上跳2i步以内,线性基第j位的 阅读全文
posted @ 2019-01-08 22:55 CaptainLi 阅读(126) 评论(0) 推荐(0) 编辑
摘要:"传送门" 首先,我们可以发现,只要在第一次我们自己拿的时候,使得对方无论怎么拿都不能使异或和为0即可获胜。 考虑到线性基任意一个非空子集的异或和不为0,那么我们只要给对方留下一个线性基即可。所以先手必胜。 之后考虑怎么让代价最小。这个也很简单,我们仿照上一道题目的做法,优先插入权值大的堆。每次判断 阅读全文
posted @ 2019-01-02 21:33 CaptainLi 阅读(107) 评论(0) 推荐(0) 编辑
摘要:"传送门" 线性基有一个重要的性质:线性基中任意一个非空子集的异或和不为0。 这好像就是给这道题准备的! 立即得到做法:按权值从大到小排序,直接插入线性基计算答案即可。 阅读全文
posted @ 2019-01-01 23:23 CaptainLi 阅读(121) 评论(0) 推荐(0) 编辑
摘要:"传送门" 做了前几天的模拟看这个现在很有感觉…… 首先我们能想出,走任何一条路径,都是可以把所有环的贡献全部异或到的(走过去的路和回来的路是一条路,贡献为0)。 因为要求最大异或和容易想到线性基。于是我们先搜索出所有环,并且把它们的异或值加入线性基中。 之后我们就只要找一条路,用它到终点的异或和和 阅读全文
posted @ 2019-01-01 14:30 CaptainLi 阅读(173) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示