07 2020 档案

摘要:强制在线求不同字符串。 由于sam中有添加边,和删除边的操作,所以我们考虑使用lct来维护sam。 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include< 阅读全文
posted @ 2020-07-31 20:52 LORDXX 阅读(98) 评论(0) 推荐(0)
摘要:sam上dp。可以将trans[s,c]看成是边,整个sam就是一个dag图。我们令dp[u]表示u结尾的,不同字串个数有多少即可。 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<c 阅读全文
posted @ 2020-07-31 15:18 LORDXX 阅读(104) 评论(0) 推荐(0)
摘要:A 首先前三个符合题意的数字是 $6$ $10$ $14$$(23 ,25,2*7)$ 那么最小的数字一定需要大于30,因为n必须由正整数组成。 所以我们可以一开始放置$6$ $10$ $14$三个数字,然后再使用n-30即可。 注意因为数字不能相同,所以需要判断一下,有相同的数字的话将14换成15 阅读全文
posted @ 2020-07-31 15:15 LORDXX 阅读(91) 评论(0) 推荐(0)
摘要:当前我们执行到第$i$位置的时候,我们以$i$结尾的字串,一共有$i$个。 分别是$[1,i],[2,i],[3,i]..[i,i]$然后令单调栈$mx,mn$保存最大值和最小值。我们可以发现的是,以某一个点为终点后,每一个最大/小值是向前作用的。并且具有单调性,即,$[j,i]$的最大值是$k$, 阅读全文
posted @ 2020-07-29 00:23 LORDXX 阅读(213) 评论(0) 推荐(0)
摘要:A 因为最大相似长度是50,所以一开始令初始数组为50个a,然后不断利用相似度,每一个先复制相似度长度的字符,然后令后续字符ascii加1模上26,即可保证不同。 #include<iostream> #include<cstring> #include<algorithm> #include<cm 阅读全文
posted @ 2020-07-28 22:52 LORDXX 阅读(106) 评论(0) 推荐(0)
摘要:求第$i$个字符串的前缀最大能与所有的字符串的后缀匹配长度的平方和。 首先,字符串匹配相等的问题可以考虑字符串hash。这道题我们发现,hash所有的字符串需要$\sum(len(s_))\(,是可以接受的。那么我们首先进行字符串的hash,统计每一个hash值有多少个。然后从头开始暴力所有的字符串 阅读全文
posted @ 2020-07-15 16:11 LORDXX 阅读(143) 评论(0) 推荐(0)
摘要:我们需要求的是,考虑A数组的以第i个结尾的字串,长度为$m$,是否满足$A[i]>=B[i]$。 假设令$dp[i][j]={1,0}$表示,A数组以第i个结尾时,长度为j的字串是否满足条件。就有$dp[i][j]\(=\)(A[j]>=B[k])$&$dp[i-1][k-1]$这样的复杂度时$o( 阅读全文
posted @ 2020-07-15 16:00 LORDXX 阅读(139) 评论(0) 推荐(0)
摘要:这道题可以用$splay$等平衡树操作,我利用的线段树。 直接思考如何判断三角形成立,即小的两边和大于第三边即可。那么对于找到的三元组{\(x,a,b\)}就有如下的判断(默认$a<b$) 1.$x<a$&&$x<b$得到$x+a>b$就有$x>b-a$ 2.$x>a$&&$x<b$得到$x+a>b 阅读全文
posted @ 2020-07-15 15:42 LORDXX 阅读(146) 评论(0) 推荐(0)
摘要:首先通过第k个,我们可以发现置换规则。可以发现每一个环和他的长度。 然后思考怎么通过第k个,找到第一个。对于每一个环而言,他转动k次的效果等于k%len(len是环的长度)记为t(t<=len),现在从t出发,还原到第一次转动。可以考虑成再模len的意义下,\(t*t^{-1}\)=1,即t关于le 阅读全文
posted @ 2020-07-15 15:32 LORDXX 阅读(159) 评论(0) 推荐(0)
摘要:假设叶子节点是L个。首先可以证明下界是$\frac{L+1}{2}$。 所以我们先把叶子节点抽出来,然后通过dfs序排序好。记为$[1,L]$ 然后连接$i,i+\frac{2}$ 我们假设有一颗子树,他的叶子节点编号是$[l,r]$,假设$r<L/2$那么该子树到根节点的链,肯定会被$[l,l+\ 阅读全文
posted @ 2020-07-15 15:20 LORDXX 阅读(124) 评论(0) 推荐(0)
摘要:这个题目本质是求,加入给一个长度为n的区间,求区间内,长度为k内的最大值是多少。因为题目时间限制,不能直接用线段树等。于是关于最大值我们思考到了单调栈。但是单调栈只能处理区间[0,r]的最大值。所以我们还需要移动左指针,保证区间长度是k。故使用双端队列。队列中单调递减。 队头保证在区间[r-k+1, 阅读全文
posted @ 2020-07-15 15:13 LORDXX 阅读(113) 评论(0) 推荐(0)
摘要:首先是题解的做法 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<climits> #include<stack> #include<vector> 阅读全文
posted @ 2020-07-15 15:07 LORDXX 阅读(145) 评论(0) 推荐(0)
摘要:由krus求MST可以知道,我们将边集合按照权值大小排序,从小到大贪心的取,其中可以发现,如果权值=x的边,被选取,那么所有权值等于=x的边对应的点应该全部在当前构建的MST中。即,权值相等的边集,在构建MST的过程中,对应点集保持一致。 所以我们这道题目按照权值sort一遍,然后再离线保存下来查询 阅读全文
posted @ 2020-07-10 19:18 LORDXX 阅读(172) 评论(0) 推荐(0)
摘要:继续打打板子热热手。 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<climits> #include<stack> #include<vecto 阅读全文
posted @ 2020-07-10 16:19 LORDXX 阅读(132) 评论(0) 推荐(0)
摘要:用lct中的access操作来维护链。因为每一次更新到根节点所以不用split操作。 注意下传标记和统计的时候影响。 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> 阅读全文
posted @ 2020-07-10 14:45 LORDXX 阅读(135) 评论(0) 推荐(0)
摘要:树链剖分。 先做轻重链剖分后,维护每一条链上的信息。初始树为空。 以每一条重链的头top为基点,建立单调栈。栈内维护,从大到小,该链上修改的深度,以及对应颜色。 每一次修改,如果栈内有比他浅的点,即,若我们把当前的颜色涂上,会使得之前的颜色覆盖掉,故我们清除掉该颜色。不断弹栈,直到为空或者栈顶比他深 阅读全文
posted @ 2020-07-09 19:59 LORDXX 阅读(160) 评论(0) 推荐(0)
摘要:在多校前,练练手,发现自己真的好菜。 一开始队友开了签到题,我随便一看看到了M,然后写了一个待修主席树,然后呢大概长这个样子 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdl 阅读全文
posted @ 2020-07-09 19:10 LORDXX 阅读(108) 评论(0) 推荐(0)
摘要:线段树分治。以时间轴建立线段树,每一个线段树节点,存放[L,R]时间内,有影响的操作1,建立可持久化trie树,trie树以商店位置为root,就可以支持商店的区间查询,然后将操作0,按照商店位置排序,进行线段树分治,每次到一个节点,先把操作0插入trie树,然后把所有当前时间内存的有影响的操作1全 阅读全文
posted @ 2020-07-08 18:31 LORDXX 阅读(130) 评论(0) 推荐(0)
摘要:nim游戏的sg函数$sg[x]=x$,故,先手必败的条件是$sg[a[1]]xorsg[a[2]]..xorsg[a[n]]==0$故,我们需要第三次开始时,sg函数不为零。也即是找到一个集合,使得他的异或值不为零。我们采用线性基插入,无法插入时表示,异或值为零。又因为要找最小值,我们就需要将线性 阅读全文
posted @ 2020-07-08 11:14 LORDXX 阅读(157) 评论(0) 推荐(0)
摘要:首先线性基的性质,当向量个数和总的个数相等的时候,不会出现0向量。也就是化成对角矩阵后,对角线上有元素并且全部为1。 这道题目要求最大值,首先我们可以进行排序。然后从小到大贪心的进行选取。而因为,线性基的性质,如果插入了一个向量,会使得后面有向量无法插入,这样影响的最多一个向量。也就是,当我选择权值 阅读全文
posted @ 2020-07-07 22:46 LORDXX 阅读(127) 评论(0) 推荐(0)
摘要:lca倍增的途中,merge一下线性基。注意线性基是从自己开始,而倍增数组fa[i][0]等于father,意味着,线性基倍增的区间是左闭右开的,fa数组是左闭右闭 #include<iostream> #include<cstring> #include<algorithm> #include<c 阅读全文
posted @ 2020-07-07 21:57 LORDXX 阅读(125) 评论(0) 推荐(0)
摘要:#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<climits> #include<stack> #include<vector> #include 阅读全文
posted @ 2020-07-07 20:36 LORDXX 阅读(110) 评论(0) 推荐(0)
摘要:树上主席树。 题意要求求u-v的路径上,前k小个数字是多少。转换一下,每次求1-k小的数字。故我们想到了树上主席树。 基于树上点前缀和的特点有:$sum[u]+sum[v]-sum[lca]-sum[fa[lca]]$是u-v路径的和。我们基于此,使用主席树,每个子树是权值线段树。就可以使用前缀和的 阅读全文
posted @ 2020-07-07 17:06 LORDXX 阅读(122) 评论(0) 推荐(0)
摘要:首先我们可以发现,长度为l的数组就是a数组不断循环构成。 令dp[i][j]表示操作到第j块,结尾是第i个数字时的结果。 $dp[i][j]=\sum_^dp[k][j-1]$但是这样复杂度过高。 于是,我们考虑前$n\cdot k$个数字。 在第j块中的第i个数字,其实转移,只有他前面的所有比他小 阅读全文
posted @ 2020-07-07 17:01 LORDXX 阅读(120) 评论(0) 推荐(0)
摘要:#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<climits> #include<stack> #include<vector> #include 阅读全文
posted @ 2020-07-07 16:46 LORDXX 阅读(110) 评论(0) 推荐(0)
摘要:#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<climits> #include<stack> #include<vector> #include 阅读全文
posted @ 2020-07-07 16:42 LORDXX 阅读(95) 评论(0) 推荐(0)
摘要:#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<climits> #include<stack> #include<vector> #include 阅读全文
posted @ 2020-07-05 18:09 LORDXX 阅读(136) 评论(0) 推荐(0)