线段树
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
CF 833B The Bakery(dp+线段树)
题意:把n个数分成k部分,使得每部分价值之和最大。每部分的价值为不同数的个数。很容易的可以想到dp,用dp[i][k]表示把前i个数分成k部分所获的最大值。则dp[i][k]=max(dp[j][k−1]+num[j+1][i],k−1≤j<i)dp[i][k]=max(dp[j][k-1]+num[j+1][i],k-1\leq j<i) num[i][j]表示a[i..j]的不同数的个数,但是原创 2017-07-31 21:05:52 · 2016 阅读 · 0 评论 -
CF527C Glass Carving(模拟+线段树)
用1和0 表示每一条可被切割的线是否被切割,然后用两棵线段树分别统计长和宽的最长连续零的个数。最大矩阵面积即为最长的长*最长的宽,即(长的最长连续零+1)∗(宽的最长连续零+1)(长的最长连续零+1)*(宽的最长连续零+1) 时间复杂度O(n* max( log2(w) , log2(h))) 求线段树最大连续子段和,最大连续0的个数等,为了满足区间加法,需另记附加信息lsum,rsum,即左起原创 2017-08-11 22:08:04 · 644 阅读 · 0 评论 -
bzoj1012 [JSOI2008]最大数(单调栈+二分/线段树)
线段树维护区间最大值或者单调栈权值递减,二分查位置。。。单调栈显然更快一些。。。线段树版原创 2017-08-11 22:34:41 · 358 阅读 · 0 评论 -
poj2777 色板游戏(线段树)
区间修改,绝对标记col,询问区间不同颜色数。原创 2017-08-11 22:55:20 · 468 阅读 · 0 评论 -
luogu1890 gcd区间(线段树/预处理)
可以直接裸线段树O(mlogn)O(mlogn),也可以直接预处理O(n2)O(n^2)。。鉴于m是n2n^2级别的,还是暴力预处理快一些hh线段树版原创 2017-08-12 11:01:23 · 476 阅读 · 0 评论 -
ural1846 GCD2010(线段树+gcd+离散化)
单点修改,相同的数给一个位置,记录出现次数,删为0就改这个点的值为0,第一次出现就改这个点的值为val,因此要离散化,变成单点修改即可。 tips:unique返回值为重复元素的首地址,即不同的数的个数+1原创 2017-08-12 11:31:03 · 426 阅读 · 0 评论 -
bzoj1798 [AHOI2009]维护序列(线段树)
区间修改+区间查询+双lazy标记 维护两个懒标记,注意优先级。没啥难度,就是细节要注意。原创 2017-08-12 12:26:31 · 318 阅读 · 0 评论 -
bzoj1230[Usaco2008 Nov]&&[TJOI2009]开关灯(线段树)
TJ的省选题居然是USACO月赛原题。。。我果然是在弱省,给跪了。 线段树维护区间修改和区间查询。原创 2017-08-12 12:08:47 · 414 阅读 · 0 评论 -
poj3667 Hotel(线段树)
维护最大连续0的个数+区间修改打标记+查询最左连续0个数为k。原创 2017-08-11 23:11:17 · 233 阅读 · 0 评论 -
bzoj3211 花神游历各国(线段树)
同bzoj3038(戳这里查看),双倍经验。原创 2017-08-12 17:21:33 · 422 阅读 · 0 评论 -
bzoj3038 上帝造题的七分钟2(线段树区间开方统计和)
线段树维护区间和,修改操作是区间开方,不满足区间加法。。咋办呢。。暴力呗,还能咋办。。还好每个数开不了几次方就变成1了,而变成1以后再开方就不需要更改了。所以我们再记一个最大值,最大值<=1时就不再修改了。改不了几次就都是1了。。原创 2017-08-12 17:03:41 · 500 阅读 · 0 评论 -
CF413E Maze 2D(线段树)
一个节点代表一个矩阵(1,l,2,r)。维护四个信息:四个角之间的最小距离,到不了就是inf,使得这四个信息具有可加性。即可用线段树进行维护。原创 2017-08-13 13:37:04 · 617 阅读 · 0 评论 -
poj1177[IOI1998]Picture (扫描线+离散化+线段树,求矩形周长并)
这人讲的很清楚了。我就再说一些细节。做了离散化之后时间和空间确实很优秀,但其实不做离散化也可以过。 扫描线这个算法,就是从左到右拿一根平行于y轴的线去扫描,遇到线段后进行处理,入边和出边。统计答案要注意。线段树负责维护的其实是一个线段覆盖的问题,我的每个节点表示的是一条线段,即a[l]a[r+1],所以我建树只建到m-1即可。复杂度应该是O(nlogn)O(nlogn)原创 2017-08-24 13:01:33 · 764 阅读 · 0 评论 -
hdu1255 覆盖的面积(线段树+扫描线+离散化,求矩形面积并)
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积。和周长并套路差不多。。甚至简单了些我觉得。重点是维护重复了两次以上的线段长度。分类讨论即可。 以coverlen[2]为例: 如果cover==0 则coverlen[2]利用子树的coverlen[2]来更新 如果cover==1 则coverlen[2]利用子树的coverlen[1]来更新 如果cover==2 则cover原创 2017-08-24 15:14:27 · 332 阅读 · 0 评论 -
poj1151 Atlantis(线段树+扫描线+离散化,求矩形面积并)
写过的裸题,还敲了半天。。。太蒻原创 2017-09-23 19:31:01 · 356 阅读 · 0 评论 -
poj2482 Stars in Your Window(线段树+扫描线+离散化)
这题目好浪漫啊~~~~~~~~~~~~~ 说正事:对于每个点,我们把它变成一个范围,这个范围的意义是,只要矩形的右上角在这个范围内,这个点就可以被这个矩形覆盖。则这个范围显然就是(x,y,x+w-1,y+h-1)的一个矩形。现在我们的题目就变为:平面上有n个矩形,每个矩形内的点都有一个权值,可以互相叠加,问你权值最大的点是多少?我们可以用扫描线解决这个问题,按x排序,每次入边就是对区间[y1,y2原创 2017-09-24 19:59:31 · 462 阅读 · 0 评论 -
bzoj1218 [HNOI2003]激光炸弹(二维前缀和+暴力/线段树+离散化+扫描线)
n=5000,暴力O(n^2)预处理二维前缀和,暴力O(n^2)枚举答案矩阵。 当然正解是O(nlogn)的线段树+扫描线+离散化的老套路。。详见poj2482原创 2017-09-24 16:13:46 · 427 阅读 · 0 评论 -
CF384E Propagating tree(线段树+思路题)
首先把子树通过dfn化为连续的区间。然后看操作: 1.对x加val,对他的儿子们-val,对他的儿子的儿子们+val,直到叶子。 2.求一个位置的数是多少。 第一个操作比较难搞,我们发现它是隔层做的,也就是说把每个点按照深度分成两组,做x点时,他的子树中与他同组的都+val,不同组的都-val。我们可以维护两棵线段树,分别维护每组加了多少,最后问pos是多少时,他的答案就是a[pos]+同组一原创 2017-09-24 22:03:50 · 271 阅读 · 0 评论 -
bzoj3999 [TJOI2015]旅游(树链剖分,有向的合并区间)
树链剖分,难点在于怎样维护答案区间。首先,这个题目啊。。。为了强行加上一个修改操作,害得我题都读不明白了。那个涨价就是顺带让你维护一个lazy。 最优解显然就是最大值-最小值啦,但是要有方向的。必须是在前面以最小值买,在后面以最大值卖。也就是一定是x->y的顺序。但是对应到线段树上,也许方向就反了,(毕竟x不一定编号小于y),因此我们在维护答案时,要注意方向。线段树每个区间只好记两个data了,分别原创 2017-09-08 11:28:42 · 639 阅读 · 0 评论 -
bzoj3339 Rmq Problem(离线+线段树)
首先mex(minimum excluded),是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。是SG函数中的一个东西。我们这道题是要多次询问这个东西。怎么搞呢?首先,1-i的mex我们是可以O(n)求出来的,记作mex[i],就像前缀一样。然后我们考虑把询问离线,按左端点排序。现在需要解决的问题就是如何从[l,原创 2017-09-16 16:16:47 · 417 阅读 · 0 评论 -
bzoj2243 [SDOI2011]染色(树链剖分,线段树求颜色段数)
树链剖分映射到线段树上,点与点的左右关系,大小关系都是不同的。因此维护ls,rs时要小心。合并答案时看的是top[x]和fa[top[x]]的颜色是否相等,看好是ls还是rs原创 2017-09-08 15:05:41 · 398 阅读 · 0 评论 -
bzoj3585 mex(离线+线段树)
同bzoj3339,就多了个离散化。原创 2017-09-16 16:38:24 · 480 阅读 · 0 评论 -
bzoj1984 月下“毛景树”(边权的树链剖分)
树链剖分,挺裸的,给的是边权,我们把边权都记在儿子上。用线段树维护单点修改,区间修改,区间加,区间最大值。需要注意的是对路径(x,y)进行操作时,不应算lca(x,y)这一点。因为他所代表的边不在路径上。原创 2017-09-08 17:30:28 · 444 阅读 · 0 评论 -
hdu5877 Weak Pair(dfs+线段树+离散化)
给定一棵有根树(注意跟不一定是1.。。),求有序对(u,v)满足的个数: 1.u是v的祖先 2.a[u]*a[v]<=k。 我们在对树进行dfs时,做到v点,此时在我们的dfs栈中的点正是v的祖先,一个不多,一个不少,我们只需在这些点中找到小于等于k/a[v]的点。显然可以把权值离散化了,用线段树来维护原创 2017-09-25 20:35:25 · 310 阅读 · 0 评论 -
hdu5692 Snacks(线段树+dfs序)
我们维护每个点到根的权值和。询问过x的路径中权值最大的,即询问x的子树中到根的距离最大的。修改x为y,则x的子树中的所有点到根的距离都加上了y-a[x]。显然可以用dfn变成连续区间用线段树来维护。原创 2017-09-25 21:53:26 · 376 阅读 · 0 评论 -
bzoj3531 [Sdoi2014]旅行(树链剖分+动态开点线段树)
我们给每个宗教都建一棵线段树,维护区间和和区间最大值。但是这样会MLE,因此我们掌握了新技能:动态开点线段树。也就是不预先把所有点都建出来,用到才建。每次最多建logn个点,所以开到mlogn就足够了。这样还要记录每棵树的左右儿子,因为他们已不再是p<<1,p<<1|1,而是任意的点了。原创 2017-09-09 12:31:34 · 395 阅读 · 0 评论 -
bzoj4999 This Problem Is Too Simple!(树链剖分+动态开点线段树)
对每一个权值开一棵线段树,维护区间和。空间不够,要动态开点。原创 2017-09-09 14:36:04 · 474 阅读 · 0 评论 -
poj2374 Fence Obstacle Course(线段树+建图spfa)
从上往下看,每条栅栏只有左右端点有意义,而且从每个点出发只会在一条栅栏处停下,所以每个点最多连两条边。我们可以用线段树维护这个连边操作。(每个点只有第一次被覆盖时连边,然后每次把两个端点加进去)然后从s点再连一下,最后剩的都再和终点连一下,然后跑最短路即可。原创 2017-09-17 20:59:21 · 359 阅读 · 0 评论 -
NOIP模拟9.16(TYVJ NOIP2017模拟赛D1)
TYVJ NOIP2017模拟赛D1T1 天天去哪吃(模拟)T2.天天和树。(求树的直径)T3.摆摊。(类似mex,离线+线段树)原创 2017-09-17 16:26:16 · 407 阅读 · 0 评论 -
fzu2082 过路费(树链剖分)
边权裸题原创 2017-09-09 19:33:29 · 314 阅读 · 0 评论 -
poj3237 Tree(树链剖分)
边权裸题。negate操作就是区间取相反数。因此为了维护最大值,我们还要维护最小值。 tips:多组数据一定要清零啊。。。懒标记要清零啊。血的教训。原创 2017-09-10 19:23:54 · 257 阅读 · 0 评论 -
hdu4718 The LCIS on the Tree(树链剖分)
有向的合并区间。看好了是求最长连续上升子序列,并非最长上升子序列。。。这样就可以拿线段树维护,左端点的值,右端点的值,左端点正着最多几个,右端点正着最多几个,左端点倒着最多几个,右端点倒着最多几个,正着最优几个,倒着最优几个,还要看好方向,真是麻烦呢。原创 2017-09-10 22:33:46 · 456 阅读 · 0 评论 -
bzoj3862/hdu4897 Little Devil I(树链剖分+线段树)
维护边权和,还要维护每个点连接的轻边是否旋转。操作1和操作3是非常裸的边权树链剖分。然而操作2很是神奇???他要更新a到b路径上的邻接边??那不是有很多??复杂度不就废了??WJMZBMR表示哈哈哈。咱们再开一颗线段树,记录每个点连接的轻边的旋转情况。我们考虑一条重链,我们要对这条重莲上的所有点的邻接边(定义为只有一个点在路径上)做旋转。不难发现,最多有两条边是重边(链的两端),其他的都是轻边。所...原创 2017-09-11 10:37:27 · 422 阅读 · 0 评论 -
hdu5052 Yaoge’s maximum profit (树链剖分)
同bzoj3999原创 2017-09-11 13:40:35 · 392 阅读 · 0 评论 -
bzoj3694 最短路(最短路+树链剖分维护最小值)
对于一条不在最短路径树里的边,设该边的两端点为x,y,长度为len,t为x和y的最近公共祖先,d[i]表示1到i的最短距离。那么对于x和t之间的点u,一定存在1-t-y-x-u的路径。路径长度为d[y]+len+d[x]-d[u]。对于给定的u点,我们需要最小化d[x]+d[y]+len。y和t之间的点同理。 所以我们枚举每一条不在最短路径树里的边.更新x,y路径上的所有点(除了lca)的最小值。原创 2017-09-11 16:37:34 · 510 阅读 · 0 评论 -
bzoj1835 [ZJOI2010]base 基站选址(dp+线段树优化)
直接dp O(n^3)会T,所以我们采用线段树优化原创 2017-09-20 17:36:05 · 416 阅读 · 0 评论 -
CF272C Dima and Staircase(线段树/贪心)
线段树直接维护区间最大值即可。或者可以发现,最大值只可能出现在最左端或最右端,贪心解决。原创 2017-10-07 22:31:43 · 345 阅读 · 0 评论 -
CF343D Water Tree(线段树+dfs序+思路)
首先对于操作一,我们按照老套路把树上结点用dfs序变成序列,每个结点的子树均为in[x]~out[x]连续的一段,段修改即可。对于操作2,往上找父亲肯定不好实现,怎么办呢?我们只改这一个点,把他改为0,然后在询问x点的时候,我们查询x的子树中是否有0,有的话他一定也是0(他一定是那个点的父亲)。这样就很巧妙的把一个点会影响他的所有祖先转化成了单点修改,查询子树。需要注意的是,这样做的话,做操作1时要原创 2017-10-07 22:39:49 · 364 阅读 · 0 评论 -
CF482B Interesting Array(线段树+位运算)
限制是区间按位与的结果必须为x,则根据按位与的性质,区间内的每一个数都至少“有”x,因此我们可以给这个区间的所有数或上x。因此我们先根据m个操作进行m个区间或操作。然后m次查询区间与是否满足要求。因此我们还要维护区间与。线段树即可。原创 2017-10-08 13:00:19 · 448 阅读 · 0 评论 -
bzoj1018 [SHOI2008]堵塞的交通traffic(线段树维护四角连通性)
这题真是恶心死了。。。虽然在CF413E见过类似的题了,还是没有想清楚。总结一下:就是维护一个2*n的矩形的四个顶点的联通情况(/最小距离),这个东西是具有区间“可加性”的,我们便可以用线段树来维护。每次更新操作都要重新维护受影响的区间信息。这题关键的地方在于询问。两点间连通的可能性太多了,见bzoj提供的题解的图。可能左点向左绕一圈,右点向右绕一圈,两点才相会,这种情况怎么解决呢?如果左点为(1,原创 2017-10-08 20:29:01 · 313 阅读 · 0 评论