码迷,mamicode.com
首页 > 其他好文 > 详细

【SPOJ GSS】数据结构套题

时间:2019-03-07 23:16:08      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:mat   最大子序列和   比较   分段   大小   处理   放弃   就是   开头   

SPOJ GSS1

题意:给一个序列以及一些询问,每个是问\([l,r]\)中最大连续子序列和是多少。

思路:这个问题是以下问题的基础

我们考虑用线段树来解决这个问题。

首先我们来想想如果要求出最大连续子序列和需要什么信息。

对于\([l,m)\)\([m,r)\)这两个区间,我们需要将它们合并成\([l,r)\)这个区间。

那么我们考虑分治地来解决这个问题。把问题分成三部分:

  • \([l,m)\)中的最大子序列和
  • \([m,r)\)中的最大子序列和
  • 左端点在\([l,m)\)内,右端点在\([m,r)\)内的最大子序列和。

其中前两个部分可以递归处理,而第\(3\)个部分则需要记录\([l,m)\)的最大后缀和以及\([m,r)\)的最大前缀和,以便求出此部分的值。所以对每个节点维护\([l,r)\)的和、最大子序列和、最大前缀和、最大后缀和。

将值上推的时候这样做:

  • 首先将\([l,r)\)的和设为\([l,m)\)的和加上\([m,r)\)的和。
  • 然后考虑最大前缀和(最大后缀和与之对称,略):这个最大前缀和的结尾可能有两种情况:
    • \([l,m)\)中,即\([l,m)\)的最大前缀和
    • \([m,r)\)中,即\([l,m)\)的和加上\([m,r)\)的最大前缀和
  • 然后最大子序列和就是\([l,m)\)的最大后缀和加上\([m,r)\)的最大前缀和。

然后就好辣。

SPOJ GSS3

题意:给一个序列以及一些询问,每个是\(1)\)\(x\)这一位上的数改成\(v\)\(2)\)\([l,r]\)中最大连续子序列和是多少。

思路:这题比GSS1只是多了修改操作,而这只是单点修改,所以直接加上正常线段树的\(update\)操作即可。

SPOJ GSS5

题意:给一个序列以及一些询问,每个是问\(max\ \sum_{k=i}^ja_k(x_1\leq i\leq y_1,x_2\leq j\leq y_2,x_1\leq x_2,y_1\leq y_2)\)

思路:我们将\(y_1\)\(x_2\)的大小情况分两类考虑:

  • \(y_1<x_2\)时,这两个区间没有任何交叉,所以答案肯定是\([x_1,y_1]\)的最大后缀和加上\([y_1+1,x_2-1]\)的和加上\([x_2,y_2]\)的最大前缀和。
  • \(y_1\geq x_2\)时,这两个区间的交叉是\([x_2,y_1]\)这段,那么我们要分几种情况考虑:
    • \(i\)\([x_1,x_2-1]\)里,\(j\)\([x_2,y_1]\)里:\([x_1,x_2-1]\)的最大后缀和加上\([x_2,y_1]\)的最大前缀和。
    • \(i\)\([x_1,x_2-1]\)里,\(j\)\([y_1+1,y_2]\)里:\([x_1,x_2-1]\)的最大后缀和加上\([x_2,y_1]\)的和加上\([y_1+1,y_2]\)的最大前缀和。
    • \(i\)\([x_2,y_1]\)里,\(j\)\([i,y_1]\)里:\([x_2,y_1]\)的最大连续子序列和。
    • \(i\)\([x_2,y_1]\)里,\(j\)\([y_1+1,y_2]\)里:\([x_2,y_1]\)的最大后缀和加上\([y_1+1,y_2]\)的最大前缀和。
  • 然后取\(max\)就好辣。
SPOJ GSS7

题意:给一棵树以及一些询问,每个是\(1)\)\(a\rightarrow b\)的路径上每一个点都赋成\(c\)\(2)\)\(a\rightarrow b\)的路径上每一个点组成的序列的最大连续子序列和。

思路:树链剖分都出来了。。。

先看第一个询问。

这个询问还是比较普通的。。。

套个树链剖分的模板做一下就行了,不过线段树中还要加上区间修改的操作。其实也蛮简单的:)

然后我们考虑第二个询问。

首先这个不可以套模板了。。。

最大连续子序列和不是个可以分段搞的东西。。。

然后放弃想了想发现我们可以\(O(log^2)\)地做!!!

首先我们按照正常步骤来把这条路径上所有的重链作为一个个区间,记为\(A_{1..m}\)

然后我们根据(da)树链剖分(le)复杂度(ge)的证明(biao)发现\(m\)不会超过\(O(log\ n)\)

所以开心地暴力。。。

枚举区间开头\(l\),区间结尾\(r\),那么就是\(\sum_{i=l+1}^{r-1}A_i\)的和加上\(A_l\)的最大后缀和加上\(A_r\)的最大前缀和。

还有一种情况就是答案就在\(A_i\)中,即\(A_i\)的最大连续子序列和。

搞死我了。。。写了\(5K\)。。。

【SPOJ GSS】数据结构套题

标签:mat   最大子序列和   比较   分段   大小   处理   放弃   就是   开头   

原文地址:https://www.cnblogs.com/denverjin/p/10493251.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!