
线段树
yzyyylx
这个作者很懒,什么都没留下…
展开
-
SPOJ GSS2 - Can you answer these queries II
题面题意给出一串数,每次询问给出l,r,求l,r之间的所有子串中,经过去重后,和的最大值是多少.做法这题和BZOJ4504 k个串相似,该题建出的主席树可以在线求以某个点为右端点时的区间最大值. 因为这题不要求在线,所以不要求线段树可持久化,因而可以根据询问的右端点进行排序,之后通过不断加入右端点,也就是区间[这个数上一次出现的位置 , 这个数的位置]加,直接用线段树求解. 比较两题,发现此题要原创 2018-05-09 13:02:40 · 374 阅读 · 0 评论 -
[ZJOI2019]语言
题面题意有一棵有n个点的树,上面有m条链,两个点可以互达当且仅当存在一条两点都在上面的链.问有几对点可以互达.做法对每个点考虑它对答案的贡献,可以发现,若点x在链a1,b1;a2,b2.....a_1,b_1;a_2,b_2.....a1,b1;a2,b2.....上,则与x可以互达的点恰好都在点a1,b1,a2,b2.....a_1,b_1,a_2,b_2.....a1,b1...原创 2019-05-14 10:44:06 · 552 阅读 · 0 评论 -
codeforces193D Two Segments
题面题意给出一个有n个数的排列,现在请你选择两个不重叠的区间,使这两个区间的数的集合可以组成一个公差为1的等差数列,问有几个这样的集合。做法我们可以用f[l,r]表示[l,r]中的所有数在给出排列中最少分成几段,这样问题就转化为了求满足f[l,r]<=2,l≠rf[l,r]<=2,l =\not rf[l,r]<=2,l≠r的区间个数。可以考虑枚...原创 2019-03-19 20:24:58 · 308 阅读 · 0 评论 -
codeforces403E Two Rooted Trees
题面题意给出两棵树A,B,其根节点都是1,现在删掉A树中的一条边(u,v),然后将B树的所有满足p,q两点中有一点在u,v的公共子树中,另外一个点不在的边(p,q)删去,然后再按上述规则来删掉A树中的所有满足条件的边,输出删边顺序。做法首先可以对于一棵树上的边(p,q),如果它要被删掉,当且仅当另外一棵树上路径pq中的任意一条边被删去,而这条路径可以通过树链剖分转化为线段树上的几段区间。...原创 2019-03-04 20:40:41 · 258 阅读 · 1 评论 -
codeforces1132G Greedy Subsequences
题面题意给出n个数和一个数m,求区间[1,m],[2,m+1]......[n−m+1,n][1,m],[2,m+1]......[n-m+1,n][1,m],[2,m+1]......[n−m+1,n]的最长贪心子序列,最长贪心子序列的求法是,在每个数后面接上右边第一个比它大的数。做法这几个询问区间可以看作是在原区间的左边加数,右边删数。如果我们记dp[i]表示以该位置为结尾的子序列的...原创 2019-03-06 10:37:45 · 387 阅读 · 0 评论 -
codeforces633H Fibonacci-ish II
题面题意给出n个数,每次询问给出l,r,询问把[l,r][l,r][l,r]这段数排序去重后,求第i个数乘上斐波那契数列的第i项的和。做法这题需要一个公式Fi−1∗Fk+Fi∗Fk+1=Fk+iF_{i-1}*F_k+F_i*F_{k+1}=F_{k+i}Fi−1∗Fk+Fi∗Fk+1=Fk+i发现利用这个公式,可以推得∑i=1nnumi∗Fi+t−1∗Fk+∑i=1nnum...原创 2019-02-27 15:45:44 · 193 阅读 · 0 评论 -
codeforces1110F Nearest Leaf
题面题意给出一棵树,它的节点的标号恰好为其dfs序,多次询问,每次询问给出三个数u,l,r,求点u到标号在[l,r][l,r][l,r]中的叶子节点的最近距离。做法考虑用线段树维护点1到各个叶子节点的距离,发现若要维护点1的儿子节点点2到各个叶子节点的距离,只要将点2的子树中的所有叶子节点的距离减去边权,其余叶子节点加上边权,这样只要将询问离线,再维护区间加和区间最小值即可。代码#in...原创 2019-02-22 08:15:50 · 238 阅读 · 0 评论 -
codeforces1117G Recursive Queries
题面题意给出一列数。定义m(l,r)m(l,r)m(l,r)表示l到r之间的最大值的位置。f(l,r)=(r−l+1)+f(l,m(l,r)−1)+f(m(l,r)+1,r)f(l,r)=(r-l+1)+f(l,m(l,r)-1)+f(m(l,r)+1,r)f(l,r)=(r−l+1)+f(l,m(l,r)−1)+f(m(l,r)+1,r)多次询问,每次询问给出lll,rrr,求f(l,...原创 2019-02-22 08:03:49 · 472 阅读 · 2 评论 -
APIO2018 新家
题面题意在一条路上有n家商店,每个商店有一个类型,在某段时间内在某个位置上存在,每次询问给出一个时间和一个地点,求该时间从该地点出发最少走多少路才可以到达任意一种类型的商店。做法首先可以离线处理,根据时间进行排序,那么没家商店就都可以看作是在某个时间加入,再从某个时间删除,并询问某个点到所有类型点的最小距离的最大值。这个可以进行二分,这样问题就转化为了,询问此时某一段区间内是否存在所有类...原创 2018-12-29 21:56:41 · 536 阅读 · 0 评论 -
Codeforces 903G Yet Another Maxflow Problem
题面题意给出一张有向图,分为A,B两部分,每个部分都有n个点,其中AiA_iAi到Ai+1A_{i+1}Ai+1,BiB_iBi到Bi+1B_{i+1}Bi+1都有一条边,还有m条边从AiA_iAi连向BjB_jBj,每次修改给出ppp,qqq,将ApA_pAp到Ap+1A_{p+1}Ap+1的边的权值改为qqq,并询问从A1A_1A1到BnB_nBn的最大流。做法首先...原创 2018-12-21 19:29:39 · 247 阅读 · 0 评论 -
[Zjoi2017]树状数组
题面题意有点难以描述将树状数组的两种操作写反后,维护单点异或(只有0和1),区间异或,则与答案正确的概率是多少。做法首先可以发现树状数组这样写反后维护的不是前缀和是后缀和,因此如果l-r的区间异或和与正确答案相同,则第l-1个数与第r个数相等,因此可以用而为线段树来维护x和y不同的概率,每次修改时根据修改位置与区间的关系讨论即可,而对于查询区间的左端点为1的情况则要特判,发现此时就是询问...原创 2018-12-08 10:00:05 · 295 阅读 · 0 评论 -
CodeForces - 718C Sasha and Array
题面题意给出一串数,要求支持以下两个操作: 1.区间加 2.区间查询f(a[i])的和,f(i)表示斐波那契的第i项的值。做法对于求f(i)的值,肯定是利用矩阵快速幂,因此f(i)可以表示为(1 1 \n 1 0)^i,这样区间加p就可以转化为区间乘单位矩阵的p次方,而且矩阵乘法满足分配率,这样就可以用线段树来维护。 维护方法: 每个线段树的结点存两个矩阵(区间f(...原创 2018-07-07 16:36:02 · 325 阅读 · 0 评论 -
CodeForces - 383C Propagating tree
题面题意给出一棵树,每个点有一个点权,要求支持两种操作: 1.查询某个点的点权 2.子树加p,在子树中,与其深度的奇偶性相同的点加p,不同的点减p。做法因为在修改时会根据深度的奇偶性做出不同的修改,因此可以维护两棵线段树,一棵维护奇数深度的,另一棵维护偶数深度的,这样对于而操作只要在一棵树上加p,在另一棵树上减p即可。代码#include<iostream...原创 2018-07-07 16:22:21 · 271 阅读 · 0 评论 -
CodeForces - 833B The Bakery
题面题意给你n个数,将它们分成k组(不改变顺序),每组的价值为这组中数字的种数,求所有组的最大价值和。做法首先思考最朴素的dp: dp[i][j]表示将前i个数分成j组的最大价值和。 因此,dp[i][j]=max(dp[i-k][j-1]+val[i-k+1][i]). 时间复杂度为O(k*n^2). 考虑优化这个dp,可以先求出dp[i][1](这列数的前缀的价值)...原创 2018-07-07 16:06:42 · 1500 阅读 · 0 评论 -
可修改主席树(树状数组套主席树)
作用 普通主席树可以查询区间k小值,但若直接修改,则复杂度极大,而可修改主席树通过树状数组的辅助来修改,大大缩小了时间复杂度,缺点是空间复杂度过大. 修改的时间复杂度为O((logn)^2),空间复杂度为O(n*logn^2).实现方法 为了减小修改复杂度,可以修改每个区间管理的范围. 传统主席树每个点对应的主席树管理一个前缀,而可修改主席树因为树状数组在处理动态区间和上有优势原创 2018-01-26 19:57:39 · 630 阅读 · 0 评论 -
主席树
作用 用于查询区间第k小值等,本质是线段树,因为是某个主席发明而得名,算法内容与主席无关.实现方法 线段树维护序列的值的个数,并对每一个前缀建一棵线段树(主席树不是这样的,否则空间…),那么要查区间[l,r]就只需要将r这棵树减去(l-1)这棵线段树,在相减后的线段树查找即可(实际不需要再建一棵树). 空间优化:根据上述方法,可以发现相邻两棵线段树的区别只有log,因而后面的线段树可原创 2018-01-24 18:06:01 · 215 阅读 · 0 评论 -
可持久化并查集
介绍可以查询并查集的历史版本,即几次操作之前的连通状态,有在线与离线两种不同算法.离线算法相比于在线算法,时间复杂度与空间复杂度均要优越得多,若要查询第k次操作之后的状态,则可以视为k节点与此节点相连,否则视为上一节点与此节点相连,则这样将会形成一棵树,记录时用启发式合并,将较小树向较大树合并,而且不进行路径压缩,这样复杂度为O(n*logn),dfs一遍即可.代码(以洛谷 P3402 【模板】可持原创 2018-03-22 18:48:15 · 295 阅读 · 0 评论 -
SPOJ GSS1 - Can you answer these queries I
题面题意给出一串数,每次询问给出l,r,求其中满足l<=i<=j<=r时,a[i]+a[i+1]……a[j]的最大值.做法用线段树来做,不难发现要想求出线段树的每个节点的最大子串和十分容易,难点就在于区间的合并. 可以对于每个线段树的上的点所维护的区间[l,r]记录3个值,其中令l<=i<=j<=r 1.sum 2.maxl:[l,i]的最大值 3.maxl.[i,r]的最大值 4.mx:原创 2018-05-08 18:50:37 · 281 阅读 · 0 评论 -
codeforces1149C Tree Generator™
题面题意给出一棵树的括号序列,每次询问会交换括号序列中的两个字符,求交换之后树的直径.做法此题的难点在于如何将树的直径转化为括号序列上的某个值.将’)‘看作1,’('看作-1后,发现直径就是maxi−1<=j<=k<=2∗(n−1)∑x=ijnum[x]−∑x=j+1knum[x]\max_{i-1<=j<=k&am...原创 2019-05-12 18:37:26 · 451 阅读 · 1 评论