
线段树
文章平均质量分 74
Frozen_Guardian
已退役菜鸡Acmer
展开
-
2021CCPC(桂林) - Suffix Automaton(后缀树+线段树)
题目大意:给出一个长度为 nnn 的字符串,再给出 mmm 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置。如果有多个答案,输出起点最小的那个。本题规定字符串大小的比较规则如下:首先按照长度排序长度相同的情况下,按字典序排序题目大意:首先还是利用后缀自动机将后缀树建出来,此时长度为 ddd 的本质不同的子串,可以用深度为 ddd 的所有节点集合表示出来。因为后缀自动机上的边都是压缩过后的,所以每条边代表的实质上是一个连续区间的子串。所以我们需要枚举深度 ddd,利用差分数.原创 2021-11-09 18:22:44 · 1583 阅读 · 6 评论 -
HDU - 5381 The sum of gcd(莫队/线段树区间合并)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问需要回答区间 [L,R][L,R][L,R] 内所有子区间的 gcdgcdgcd 之和。更具体的,对于询问 [L,R][L,R][L,R],输出 ∑l=LR∑r=lRgcd{al,al+1,⋯ ,ar}\sum\limits_{l=L}^{R}\sum\limits_{r=l}^{R}\gcd\{a_l,a_{l+1},\cdots,a_r\}l=L∑Rr=l∑Rgcd{al,al+1,⋯,ar}题目原创 2021-08-26 18:48:18 · 250 阅读 · 0 评论 -
洛谷 - P4390 [BOI2007]Mokia 摩基亚(带修二维数点-四叉线段树/CDQ分治)
题目链接:点击查看题目大意:给出一个二维平面坐标系,需要执行数次操作,具体操作分为下列两种:1 x y a:坐标 (x,y)(x,y)(x,y) 加上 aaa 个点2 x1 y1 x2 y2:查询以 (x1,y1)(x_1,y_1)(x1,y1) 为左下角、(x2,y2)(x_2,y_2)(x2,y2) 为右上角的矩阵中有多少个点题目分析:三种做法,但是树套树内存不太够,所以拿不了满分。剩下的四叉树跑的巨慢,cdq分治表现还算不错。因为写 cdqcdqcdq 的时候询问和加点并不会冲突原创 2021-08-23 18:41:58 · 491 阅读 · 0 评论 -
2021HDU多校8 - 7059 Counting Stars(线段树)
题目链接:点击查看题目大意:给出 nnn 个数字,需要执行 mmm 次操作,每次操作分为下列三种类型:1 l r :输出区间 [l,r][l,r][l,r] 的 sumsumsum 和2 l r:区间 [l,r][l,r][l,r] 内的每个数都减去 lowbit(a[i])lowbit(a[i])lowbit(a[i])3 l r:区间 [l,r][l,r][l,r] 内的每个数都加上 highbit(a[i])highbit(a[i])highbit(a[i])每个数的 lowbitlow原创 2021-08-12 22:09:19 · 457 阅读 · 0 评论 -
CodeForces - 1557D Ezzat and Grid(线段树+dp)
题目链接:点击查看题目大意:给出 nnn 个 010101 串,现在问最少需要删掉多少个串,才能使得剩下的串拼起来是连通的规定两个 010101 串是连通的,当且仅当存在至少一列,在两个串中都为 111题目分析:正难则反,题目要求删除最少,那么我们思考如何使得保留下来的串最多。考虑 dp[i]dp[i]dp[i] 为以第 iii 个序列为结尾的,可以保留的最多的串的个数,模仿最长不下降子序列的思路,dp[i]=dp[j]+1dp[i]=dp[j]+1dp[i]=dp[j]+1,当且仅当串 iii 和串原创 2021-08-11 16:08:58 · 265 阅读 · 0 评论 -
2021牛客多校7 - xay loves monotonicity(线段树区间合并)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数字序列 aaa 和 010101 序列 bbb,需要执行 mmm 次操作,每次操作分为如下三种类型:1 x y:修改 a[x]=ya[x]=ya[x]=y2 l r:区间 [l,r][l,r][l,r] 内的 bbb 置反3 l r:输出区间 [l,r][l,r][l,r] 的贡献最后说一下区间 [l,r][l,r][l,r] 的贡献为,首先找到区间 [l,r][l,r][l,r] 内的 “最长不下降子序列”,设其为 {p1,p2,...原创 2021-08-08 20:51:03 · 342 阅读 · 4 评论 -
洛谷 - P4062 [Code+#1]Yazid 的新生舞会(推公式+线段树)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,现在要求存在 绝对众数 的子区间个数所谓 绝对众数,就是对于区间 [l,r][l,r][l,r] 来说,存在一个数字的出现次数 cntcntcnt,满足不等式 cnt∗2>r−l+1cnt*2>r-l+1cnt∗2>r−l+1题目分析:假如字符集很小,我们可以对每个字符集单独讨论,即枚举每个字符作为众数,判断合法的区间个数。如何判断?设置一个辅助数组 bbb,若原数组的 iii 位置是该字符,则令 b[i]=1b[i]=1b原创 2021-08-04 00:07:41 · 309 阅读 · 0 评论 -
2021牛客多校6 - Hopping Rabbit(矩形取模+扫描线)
题目链接:点击查看题目大意:二维平面给出 nnn 个矩形,现在要求找到一个点 (x+0.5,y+0.5)(x+0.5,y+0.5)(x+0.5,y+0.5),满足对于任意的 (x+0.5+k1d,y+0.5+k2d)(x+0.5+k_1d,y+0.5+k_2d)(x+0.5+k1d,y+0.5+k2d) 都不会出现在任意一个矩形中题目分析:假设我们找到的目标点为 (x,y)(x,y)(x,y),不难每次移动目标点,对于每个矩形来说,对 ddd 取模后的相对坐标都是不变的,所以我们不妨将每个矩形都对原创 2021-08-02 23:35:11 · 477 阅读 · 0 评论 -
HDU多校4 - 6992 Lawn of the Dead(线段树+模拟)
题目链接:点击查看题目大意:给出一个 n∗mn*mn∗m 的矩阵,有 kkk 个点被 banbanban 掉了,现在从点 (1,1)(1,1)(1,1) 出发,只能向右或向下移动,问可以到达的点有多少个题目分析:先做一些定义,定义无法到达的点为“坏点”,可以到达的点为“好点”虽然 n∗mn*mn∗m 很大,不能直接 bfsbfsbfs,但是单独的 nnn 或 mmm 却不大,这里我从列入手,考虑相邻的两列,假设 preprepre 为上一列的状态,现在考虑 curcurcur 的情况。对于第 cur原创 2021-07-30 15:15:38 · 933 阅读 · 2 评论 -
2021牛客多校4 - Tree Xor(线段树+异或区间拆分)
题目链接:点击查看题目大意:给出一棵 nnn 个点组成的树,每个点权的取值范围是 [li,ri][l_i,r_i][li,ri],每条边权代表的是两点的异或值,现在问这棵树有多少种有效赋值题目分析:假设点 111 为基准点,找到点 111 到 nnn 个点的路径上的异或和记为 wiw_iwi,那么问题转换为了,点 111 有多少种可行的取值 xxx,需要同时满足 nnn 个不等式:li≤(wi⊕x)≤ril_i\le (w_i\oplus x)\le r_ili≤(wi⊕x)≤ri考虑 w原创 2021-07-27 10:49:52 · 456 阅读 · 0 评论 -
2021牛客多校1 - Journey among Railway Stations(线段树区间合并)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列表示火车站,每个火车站都有两个属性 [u,v][u,v][u,v],表示在站时间。相邻两个火车站之间有一个距离,即从第 iii 个火车站到第 i+1i+1i+1 个火车站需要花费 cost[i]cost[i]cost[i] 个单位的时间。现在需要完成 mmm 次操作,每次操作分为三种类型:0,l,r:询问从第 lll 个火车站开始坐车,是否可以依次经过中途的火车站,直到 rrr 下车1,i,w:修改 cost[i]=wcost[i]=wco原创 2021-07-22 20:05:33 · 334 阅读 · 1 评论 -
AcWing - 246. 区间最大公约数(树状数组+线段树)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,需要执行 mmm 次操作,每次操作分为下列两种类型:C l r d:将区间 [l,r][l,r][l,r] 位置的数字都加上 dddQ l r:询问区间 [l,r][l,r][l,r] 的最大公约数题目分析:首先是推广一下最大公约数的公式:gcd(a,b)=gcd(a,b−a)gcd(a,b)=gcd(a,b−a)gcd(a,b)=gcd(a,b−a)gcd(a,b,c)=gcd(a,b−a,c−b)gcd(a,b,c)=gcd(原创 2021-07-12 20:00:55 · 189 阅读 · 0 评论 -
CodeForces - 1539F Strange Array(线段树区间合并)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,规定位置 iii 的贡献是:设 x=a[i]x=a[i]x=a[i],选择一个包含 iii 的区间 [l,r][l,r][l,r],将其中的数排序后,使得中位数和 xxx 之间的距离的最大值。题目要求输出 nnn 个位置的答案题目分析:设 xxx 为中位数,将大于 xxx 的位置视为 111,小于 xxx 的位置视为 000 ,然后求最长连续子段和,是解决中位数问题经典模型。对于本题而言,假设只需要询问一个位置的话,可以从该位置向左向右扩展原创 2021-06-20 23:19:47 · 288 阅读 · 0 评论 -
2020-2021年度第二届全国大学生算法设计与编程挑战赛 (春季赛)- 天才的操作(线段树+主席树+树上倍增)
题目链接:点击查看题目分析:刚看到这个题目的时候,口胡了一个假算法,觉得对于每次询问的操作 [l,r][l,r][l,r] ,只需要找到指令集区间 [l,r][l,r][l,r] 内覆盖到点 kkk 的最大并集,然后求出这段区间中 aaa 数组的最大值就是答案了,这样一来直接用线段树维护一下数组 aaa,再用主席树维护一下区间交集即可但后来转念一想,覆盖的区间还有时序问题,也就是两个区间执行的先后顺序不同,会造成不一样的结果,到此为止这个题也就卡住了今天看了题解和杨大佬讨论了一下就豁然开朗了,其实卡.原创 2021-06-07 18:43:09 · 552 阅读 · 2 评论 -
兰州大学第一届『飞马杯』程序设计竞赛 - ★★飞马祝福语★★(动态dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss ,现在有 mmm 次操作,每次操作可以修改 [l,r][l,r][l,r] 内的字符为 chchch,问每次修改之后的字符串内含有多少个 “FeiMa” 的子序列题目分析:这种题应该叫动态 dpdpdp 吧,线段树的每个节点维护一个 dpdpdp,dpl,rdp_{l,r}dpl,r 代表含有子序列 [l,r][l,r][l,r] 的数量,合并的话就是:dpk,l,r=dpk<<1,l,r+dpk<<1∣1原创 2021-05-29 20:20:52 · 249 阅读 · 3 评论 -
AtCoder - arc120_c Swaps 2(思维+线段树+模拟)
题目链接:点击查看题目大意:给出一个序列 aaa,问能否经过有限此操作使其变成 bbb,每次操作分为三步:选择一个 iii,满足 i+1<=ni+1<=ni+1<=n,然后 swap(ai,ai+1)swap(a_i,a_{i+1})swap(ai,ai+1)ai++a_i ++ai++(交换后的)ai+1−−a_{i+1}--ai+1−−(交换后的)如果有解,输出最小操作次数题目分析:思维点+固定模型的题目,有个结论是,题目有解的充分必要条件是,当且仅当 aaa原创 2021-05-29 16:35:34 · 363 阅读 · 1 评论 -
CodeForces - 1430E String Reversal(线段树+模拟)
题目链接:点击查看题目大意:给出一个字符串 sss ,令其反转的串为 ttt ,每次操作可以将 ttt 中的两个相邻位置的字符交换,问最少需要进行多少次操作才能使得 ttt 变成 sss题目分析:假设字符 chchch 在 sss 中的出现位置为 p1,p2...pkp_1,p_2...p_kp1,p2...pk,在 ttt 中出现的位置为 q1,q2,...qkq_1,q_2,...q_kq1,q2,...qk,那么显然让 pip_ipi 和 qiq_iqi 匹配一定是最优的如此一原创 2021-05-29 11:15:11 · 281 阅读 · 0 评论 -
CodeForces - 1529E Trees of Tranquillity(贪心+线段树)
题目链接:https://vjudge.net/problem/CodeForces-1529E题目大意:给出两棵根节点为 111 的树,分别称为 AAA 树和 BBB 树,现在通过两棵树可以构造出一个无向图,当且仅当点对 (x,y)(x,y)(x,y) 同时满足以下两个条件时,可以在图中建边:在 AAA 树中,xxx 是 yyy 的祖先或 yyy 是 xxx 的祖先在 BBB 树中,xxx 不能是 yyy 的祖先同时 yyy 不能是 xxx 的祖先求该图的最大团题目分析:一开始读错题了,后来原创 2021-05-25 18:36:25 · 599 阅读 · 4 评论 -
CodeForces - 1527E Partition Game(dp+线段树)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列,现在需要将其划分成 kkk 段,使得贡献和最小对于每段区间 [l,r][l,r][l,r] 的贡献为,其中每个数字,其最后一次出现的位置减去其首次出现的位置输出最小贡献题目分析:区间划分,经典的 dpdpdp 问题,dpi,jdp_{i,j}dpi,j 代表前 iii 个数划分为 jjj 个区间的最优解,两种转移方程:dpi,j=min(dpi−1,j+(ai属于上一段的贡献),dpi−1,j−1+(ai独成一段的贡献))dp_{i,原创 2021-05-21 16:17:38 · 628 阅读 · 0 评论 -
CodeForces - 1514D Cut and Stick(线段树/随机数)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列,需要回答 mmm 次询问,每次询问给出一段区间 [l,r][l,r][l,r],输出至少需要将这段区间拆成的最少段数,使得每段区间中,假设区间长度为 xxx,那么出现次数最多的数字不能超过 ⌈x2⌉\lceil \frac{x}{2} \rceil⌈2x⌉ 次题目分析:对于某一段区间来说,假设区间长度为 xxx ,出现次数最多的数字 ttt 的出现次数为 fff,满足 f>⌈x2⌉f>\lceil \frac{x}{2} \rce原创 2021-05-13 00:31:33 · 299 阅读 · 0 评论 -
HDU - 6183 Color it(动态开点线段树/树状数组套动态开点线段树)
题目链接:点击查看题目大意:给出一个二维平面坐标系,需要完成四种操作:0:删除所有点1原创 2021-05-06 11:34:20 · 256 阅读 · 9 评论 -
CodeForces - 787D - Legacy(线段树优化建图+最短路)
题目链接:点击查看题目大意:给出 nnn 个点和 mmm 条边,现在需要求从 ststst 开始到所有点的最短路是多少,mmm 条边的给出方式如下:1 u v w1 \ u \ v \ w1 u v w:点 uuu 向点 vvv 连一条权值为 www 的边2 u l r w2 \ u \ l \ r \ w2 u l r w:点 uuu 向点 i∈[l,r]i原创 2020-12-24 17:48:31 · 307 阅读 · 3 评论 -
2020ICPC(南京) - Just Another Game of Stones(吉司机线段树+博弈)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列 aaa,现在需要执行 mmm 次操作,每次操作分为两种类型:1 l r x1 \ l \ r \ x1 l r x:对于所有 i∈[l,r]i \in [l,r]i∈[l,r] 执行 ai=max(ai,x)a_i=max(a_i,x)ai=max(ai,x)2 l r x2 \ l \ r \ x2 l r x:对于原创 2020-12-23 16:42:12 · 831 阅读 · 4 评论 -
CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)
题目链接:点击查看题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型:1 x y1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间没有连边,则增加连边;如果 (x,y)(x,y)(x,y) 之间存在连边,则删除连边2 x y2 \ x \ y2 x y:询问点 xxx 和点 yyy 之间是否联通询问需要强制在线题目分析:关于强制在线实现连边与加边原创 2020-12-22 14:06:20 · 335 阅读 · 1 评论 -
CodeForces - 504B Misha and Permutations Summation(线段树模拟康托展开与逆展开)
题目链接:点击查看题目大意:给出两个排列 ppp 和 qqq,现在要求输出其中,Prem(x)Prem(x)Prem(x) 是第 xxx 个排列,Ord(p)Ord(p)Ord(p) 是排列 ppp 是第 Ord(p)Ord(p)Ord(p) 个排列题目分析:线段树模拟康托展开参考:https://www.luogu.com.cn/blog/yummy-loves-114514/huoxingren当得出数组 aaa 和 bbb 后分别代表排列 ppp 和 qqq 的康拓展开表达式,虽然得到的是变进原创 2020-12-21 11:16:28 · 231 阅读 · 2 评论 -
CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)
题目链接:点击查看题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类:一定是最小生成树上的边可能是最小生成树上的边一定不是最小生成树的边题目分析:两种思路,一种是比较好想,但是写起来比较麻烦,还有点卡常,另一种是需要一定的思维,相应的实现起来也是比较简单先说需要思维的方法,参考克鲁斯卡尔的实现方法,不难看出权值较大的边一定不可能有机会去替换掉权值较小的边,所以如果一条边可能出现在多个最小生成树上时,一定是可能会被其他同权值的边替换,所以在实现克鲁斯卡尔原创 2020-12-18 17:43:00 · 339 阅读 · 4 评论 -
CodeForces - 817F MEX Queries(线段树lazy序)
题目链接:点击查看题目大意:初始时有一个空的集合,需要执行 n 次操作:1 l r:将区间 [ l , r ] 内未出现的数加入到集合中 2 l r:将区间 [ l , r ] 内出现的数字全部删除 3 l r:将区间 [ l , r ] 内未出现的数加入到集合中,同时将区间 [ l , r ] 内出现过的数字全部删除每次操作后取集合的 MEX题目分析:HDU - 3397的弱化版简化版题意就是,初始时有一个全 0 的序列,操作 1 是将区间内的数全部修改为 1,操作 2 是将区间内.原创 2020-11-26 21:49:26 · 269 阅读 · 2 评论 -
CodeForces - 487B Strip(线段树+dp+二分)
题目链接:点击查看题目大意:给出一个长度为 n 的序列,现在要求分成尽可能少的子段,且每个子段需要满足:最大值与最小值的差值小于等于 s 子段长度大于等于 l题目分析:dp[ i ] 代表的是前 i 个数字分成最少的子段个数,转移方程如下:dp[ i ] = dp[ j - 1 ] + 1:第 i 项单独一段 dp[ i ] = dp[ j - 2 ] + 1:第 i 项与 i - 1 项组成一段 ... dp[ i ] = dp[ 0 ] + 1:第 1 ~ i 项组成一段显然是取原创 2020-11-25 21:50:01 · 239 阅读 · 0 评论 -
CodeForces - 731D 80-th Level Archeology(线段树+暴力/差分)
题目链接:点击查看题目大意:给出 n 个数列,再给出一个模数 mod,每次操作可以将所有的数字进行:x = x %mod + 1 操作,问至少进行多少次操作,才能使得 n 个数列按照字典序非降序排列题目分析:思维不够暴力来凑。。感觉很像是威海线段树维护哈希暴力取模的那个题,事实证明是可以类比过去的先说我的思路,对于任意两个相邻的数列来说,先找出其首个不相同的位置 pos,然后记录一下其值,在代码中我记做了 a 和 b,因为对于这两个数列来说,a 和 b 的大小关系就直接决定了这两个数列的相对大小原创 2020-11-25 18:25:25 · 230 阅读 · 0 评论 -
CodeForces - 1454F Array Partition(线段树+二分)
题目链接:点击查看题目大意:给出一个长度为 n 的序列,现在要求求出任意一组 x , y , z,满足下列条件:x + y + z = n max( 1 , x ) = min( x + 1 , x + y ) = max( x + y + 1 , n )题目分析:昨晚上用单调栈写的写崩了,到现在还是不知道哪里写崩了。。太拉胯了因为这个题目给出的序列是需要静态查询最值,用 st 表或线段树都可以快速查询,因为感觉线段树写起来简单就直接上线段树了最简单的一种思路是直接 n^2 去枚举两个断原创 2020-11-25 17:53:30 · 2692 阅读 · 4 评论 -
CodeForces - 444C DZY Loves Colors(线段树+剪枝)
题目链接:点击查看题目大意:给出一个长度为 n 的数组 a 和计算贡献的数组 sum,需要执行 m 次操作,每次操作分为下列两种类型:1 l r x:将区间 [ l , r ] 内的 a 用 x 覆盖,即 i ∈[ l , r] , a[ i ] = x,且 sum[ i ] += abs( a[ i ] - x ) 2 l r:询问区间 [ l , r ] 内的 sum 数组之和题目分析:修改时直接将元素相同的区间统一处理即可这里作为一个剪枝,可以让时间复杂度均摊下来是 nlogn 的,写好p原创 2020-11-23 18:16:27 · 230 阅读 · 2 评论 -
CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)
题目链接:点击查看题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树题目分析:考虑求解次小生成树的思路:求出最小生成树 ans 枚举每一条非树边 ( u , v ),然后删除树上 ( u , v ) 这条路径上的最大值,即此时生成树的答案变为 ans +w( u , v ) - mmax 选择次小的作为答案所以在求出最小生成树后,对于每一条边来说,只需要求出路径上边权的最大值即可可以用树剖+线段树硬写,因为本题是静态的一棵树,所以用树上倍增在时间复.原创 2020-11-18 16:29:15 · 306 阅读 · 2 评论 -
CodeForces - 1440E Greedy Shopping(线段树)
题目链接:点击查看题目大意:给出一个非严格递减的子序列,需要完成 m 次操作,分为下列两种类型:1 x y:将区间 [ 1 , x ] 中的数进行 a[ i ] = max( a[ i ] , y ) 操作 2 x y:给出一个权值 y,从 x 开始往 n 走,遇到 a[ i ] 如果满足 a[ i ] <= y,则执行:ans++,y-=a[ i ],输出 ans题目分析:赛后发觉是个比较裸的线段树,只不过对于操作二的询问有点小技巧,可以算的上是一种小套路?对于操作 1 来说,因为整原创 2020-11-18 15:40:41 · 296 阅读 · 2 评论 -
洛谷 - P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并(树上差分+线段树合并)
题目链接:点击查看题目大意:给出一棵树,再给出 m 次操作,每次操作会选择两个点 ( x , y ) ,使得这条路径上的所有点的种类 z 加一,最后问每个点的哪个种类出现的频率最高,若多个种类出现频率相同时,输出编号最小的题目分析:线段树合并模板题,感觉 update 函数和主席树非常像,所以就仿照主席树的写法去实现的,相比于正常的线段树来说,仅仅多了一个 merge 函数用于合并两棵线段树罢了,时间复杂度是严格 nlogn 的,因为维护的时候采用的是树上差分,即:x + 1 y + 1 l原创 2020-11-12 19:37:11 · 299 阅读 · 6 评论 -
2020ICPC(小米邀请赛2) - Data Structure Problem(线段树+树状数组)
题目链接:点击查看题目大意:给出一个长度为 n 的数列 a 和数列 b,然后需要维护一个前缀和 c,c 的定义如下:c[ i ] = max( c[ i - 1 ] + b[ i ] , a[ i ] )现在需要执行 m 次操作,每次操作分为下列三种类型:1 x y:令 a[ x ] = y 2 x y:令 b[ x ] = y 3 x:输出 c[ x ]题目分析:自己手玩一下不难发现,c[ x ] 的取值范围无非就是下列的情况中取最大值:b[ 1] + b[ 2 ] + ... +.原创 2020-11-03 18:10:49 · 251 阅读 · 0 评论 -
洛谷 - P6292 区间本质不同子串个数(SAM+LCT+线段树)
题目链接:点击查看题目大意:给出一个长度为 n 的字符串,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 内有多少个本质不同的字符串题目分析:首先简化模型,回顾一下如何求解 “区间内有多少个不同的数” :SPOJ - DQUERY求解上面那道题目的方法可谓是五花八门,我们采用其中一种离线的方式:先将所有的询问储存下来,按照右端点 r 排序后,每次对于重复出现的数字,用线段树维护其最后一次出现的位置,那么答案就是 [ l , r ] 中元素的个数了对于这个题目而言,将每个本质不同原创 2020-10-30 22:30:26 · 1499 阅读 · 0 评论 -
2020ICPC(小米邀请赛1) - Phone Network(线段树优化递推)
题目链接:点击查看题目大意:给出一个长度为 n 的数列,每个数的取值范围是 [ 1 , m ],题目保证了每个数至少出现过一次,现在对于 i ∈ [ 1 , m ] ,分别输出在原数列中,包含了 [ 1 , i ] 的所有种类数字的最短长度题目分析:刚着手时想了很多做法,但都不能通过数据结构优化到合适的时间复杂度,比如 O( m ) 枚举数字,每次 O( n ) 去尺取,亦或是 O( m ) 枚举数字,然后二分长度去 check,越想越离谱。。其实这个题目已经在提示需要往递推的方面去想了,先放上原创 2020-10-27 15:39:19 · 363 阅读 · 0 评论 -
2020CCPC(威海) - Caesar Cipher(线段树+哈希)
题目大意:给出一个长度为 n 的序列,接下来有 m 次操作,每次操作分为下列两种类型:1 l r:区间 [ l , r ] 内的所有数都加 1 并对65536 取模,也就是 i ∈ [ l , r ] ,有 a[ i ] =( a[ i ] + 1) % 65536 2 x y len:查询两段区间 [ x , x + len - 1 ] 和 [ y , y + len - 1 ] 内的序列是否相同题目分析:第一种操作可以转化成区间更新,第二种操作可以转换成区间查询和哈希,所以不难想到使用线...原创 2020-10-26 16:07:08 · 745 阅读 · 1 评论 -
CodeForces - 571D Campus(数据结构综合)
题目链接:点击查看题目大意:题目分析:数据结构的题目写起来真好玩~(debug到吐)考虑离线,题目实质上就是维护两个森林,然后对同一个序列进行的赋值操作,如果是对单一的森林进行加边删边然后连通块内求值修改之类的话,不难想到克鲁斯卡尔重构树,但两个森林的话该怎么办呢注意到第一个森林中对连通块的操作是加法,第二个森林中对连通块的操作是置零任取一个点 x 进行讨论,假设现在不考虑第二个森林的贡献,也就是忽略掉第二种操作和第四种操作,并且在每次操作后都记录一下点 x 的值,更具体的,设 va原创 2020-10-14 18:18:31 · 264 阅读 · 0 评论 -
中石油训练赛 - Check List(线段树维护偏序问题)
题目大意:给出 n 个点,需要计算出满足下列条件的三元对 ( i , j , k ) 的数量:x[ i ]< x[ j ]< x[ k ] y[ k] > y[ i ] > y[ j]题目分析:可以先对 x 进行排序,然后从左到右枚举每一个点去计算其作为三元对中的第一个点、第二个点和第三个点时的贡献先想一个简单版本的问题,如果将偏序问题转换为:x[ i ]< x[ j ]< x[ k ] y[ i ] <y[ j] <y...原创 2020-10-12 15:25:41 · 276 阅读 · 4 评论