随笔分类 - 线段树&树状数组
摘要:传送门 sb题面误导了我半天。 按位考虑, 对于 a[i]和i的一位考虑什么样的a[j]和j可以转移过来,发现这一位有一种一定可以一种一定不行,还有两种不确定。 考虑魔改01trie每一个节点4个儿子,但是这样01trie会T。 发现不确定的两种情况a[j]和$j
阅读全文
摘要:多次询问求一个串的结尾在[l,r]之间的本质不同子串个数。 此题是求一个区间的不同元素的问题,使用扫描线的方法解决,即每次加入一个元素就将这个位置+1,这个元素上一次出现的位置−1。 考虑使用SAM解决。 其实就是将所有结尾在[l,r]的前缀代表的节点与parent树的根的路径上
阅读全文
摘要:###1001 Static Query on Tree 转化题意之后就是问一棵树有多少点满足是集合A中某个节点的祖先且是B中某个节点的祖先且是C中某个节点的后代。 |A|+|B|+|C|<=105 满足条件的点一定构成一条链,并且链上最浅的节点是C中节点最深的节点是A中一
阅读全文
摘要:n个点m条边的连通图,每个点有第ci种权值为vali的宝藏,问从x点出发只通过边权小于等于y的边可以获得的宝藏最大权值,每种宝藏权值只能算一遍。宝藏权值带修改。每种宝藏最多有10个。 建出克鲁斯卡尔重构树,考虑在节点上维护答案。发现每种宝藏最多有10个,所以可以建出每一种
阅读全文
摘要:传送门 这个题我第一眼望过去还以为CF终于出了一个数据结构题,然而实际上这就是一个数据结构题 ####题意: 维护一个长度为n的序列,序列的每一个元素大小a[i]初始为0,颜色初始为1. 有三个操作执行q次 1.把[l,r]涂成颜色c 2.把所有颜色为c的元素加上x
阅读全文
摘要:本题解并不提供圆方树讲解。 ~~所以不会圆方树的出门右转问yyb~~ 没有修改的话圆方树+链剖。 方点的权值为点双连通分量里的最小值。 然后修改的话圆点照修,每一个方点维护一个小根堆。 考虑到可能被菊花卡死。 我们每一个方点只维护儿子的最小值。 当询问的路径lca为方点时,$ans=min(an
阅读全文
摘要:考虑两一个暴力 1 因为询问[a,b]可以拆成[1,b] [1,a1]所以把询问离线,然后就是求[1,x]中被Si包含的串的数量。考虑当[1,x1][1,x]时我们把Sx结束节点在fail树的子树加1。然后询问就是求Si在AC自动机上跑时经过所有点的点权用
阅读全文
摘要:~~SAM+线段树合并的裸题。~~ 但我们讨论AC自动机的做法。 先建出AC自动机。考虑询问在[a,b]中出现的次数就是[1,b]的出现次数 [1,a1]的出现次数。把询问离线。然后我们要求的就是第i个字符串在[1,x]中出现次数。我们在从[1,x1]到[1,x]的过程中把$
阅读全文
摘要:建立AC自动机然后,加入一个串之后考虑这个串的贡献。我们把这个串扔到AC自动机里面跑。最后对经过每一个点到的这个点在fail树的根的路径上的点有1的贡献。求链的并,我们把这些点按DFS序排序,然后把每一个点加1,每个点与上一个点的LCA 1,然后询问时的答案就是子树和这个用树状数组维护就行。至于为什
阅读全文
摘要:我们预处理出来以i为结尾的最长回文后缀(回文自动机的构建过程中就可以求出)然后就是一个区间覆盖,因为我懒得写贪心,就写了线段树优化的DP。 cpp include include include include include using namespace std; const int N=101
阅读全文
摘要:给你一个串S以及一个字符串数组T[1..m],q次询问,每次问S的子串S[pl..pr]在T[l..r]中的哪个串里的出现次数最多,并输出出现次数。 如有多解输出最靠前的那一个。 我们首先对m个字符串数组建出后缀自动机,然后我们可以通过跳trans边找到S前i个字符代表的前缀的最长后缀。我们要找的是
阅读全文
摘要:很容易想到只考虑后缀长度必须为max(height[rk[i]],height[rk[i]+1])+1(即[i,i+x1]代表的串只出现过一次)然后我正着做一遍反着做一遍,再取一个min最后挂了。。。 设x=max(height[rk[i]],height[rk[i]+1])+1我
阅读全文
摘要:我们把所有的名,姓,询问都拼起来构成一个新的长串,然后跑一边SA。排完序后对于每一个询问,我们可以二分求出它所对应的区间(即满足这个区间的前缀都是这个询问串)。然后问题就转化为很多区间问区间出现过的不同的数。这个东西可以用离线后吧询问按右端点从小到大排序+树状数组解决(HH的项链,采花)。 那么第二
阅读全文
摘要:~~今天原来是平安夜啊~~ 感觉这题是道好题。 一个套路枚举权值x,把权值等于x的设为1,不等于的设为 1,然后问题转化为多少个区间权值和大于。 发现并不是很好做,还有一个套路,用前缀和查分来表示区间。然后就是 $$i include include include include incl
阅读全文
摘要:听说这题的所发和 很像。 然而那道题我使用莫队写的。。。 这是一个套路,pre数组加升维(在线)。 记录一个pre数组,pre[i]代表上一个和i颜色相同的下标。 我们把询问离线,扫一遍a数组。然后每扫过一个点,就把pre[pre[i]]这个位置上减1,把pre[i]加1。然后每
阅读全文
摘要:发现每次区间加只能加1,最多全局加n次,这样的话,最后的答案是调和级数为nlogn,我们每当答案加1的时候就单点加,最多加nlogn次,复杂度可以得当保证。 然后问题就是怎么判断答案是否该加1。我们可以用线段树设初值为给出的排列,把区间加改成区间减,维护最小值。当最小值为0是遍历左右子树
阅读全文
摘要:一开始想的是莫队,然后维护几个bitset,然后瞎搞。脑子里想了想实现,发现并不好写。 还是主席树好写。我们维护一个权值的线段树,记录每一个权值的最后一次出现的位置下标。我们查询的时候要在前r颗线段树中找到第一个出现的位置下标小于l的数,在线段树上二分就行了。 这个想法还是非常巧妙的。 cp
阅读全文
摘要:这题需要一个黑科技——摩尔投票。这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数。 简而言之就是 ; 比如有一个代表投票结果的序列。 [1,2,1,1,2,1,1] 我们记录一个num和cnt先别管它们是干什么的。我们模拟一遍模拟排序。 $$首先读第一个数1,nu
阅读全文
摘要:我们把每一次交换看做两个插入两个删除。然后就是一个三维偏序。时间一维,下标一维,权值一维。 cpp include include include include include using namespace std; const int N=100010; struct query{ int t
阅读全文
摘要:1594: [Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力。 游戏开始前,一 头指定的奶牛会在牛棚后面摆N(1 <= N<= 1,000,000)堆干草,每堆有若干捆,并且没有哪两堆中的草一样多。所
阅读全文