SPOJ GSS系列 最大子段和 线段树+树链剖分+splay 1043 1557 1716 2713 2916 4487 6779

最大子段和的各种形式

题解内附每道题的 题意 题目链接 思路

SPOJ 1043 GSS1

静态区间求个最大子段和,

题解

SPOJ 1577 GSS2

和1一样,区别是若区间内存在相同的元素,则该元素只计算一次。

离线一下然后使劲跑。。

题解

SPOJ 1716 GSS3

和1一样,就是要支持单点修改

题解

SPOJ 2713 GSS4

==普通线段树,感觉和这系列关系不大。

题解

SPOJ 2916 GSS5

题意有点怪,,跟3差不多,就是稍加强了点询问

题解

SPOJ 4487 GSS6

和3也差不多。就是区间可以翻转移动啥的。

splay

题解

SPOJ 6779 GSS7

在静态的树上询问任意路径的最大子段和 以及单点修改

因为树的结构不会变,所以在线段树上剖分就可以了

题解

时间: 2024-10-07 05:26:13

SPOJ GSS系列 最大子段和 线段树+树链剖分+splay 1043 1557 1716 2713 2916 4487 6779的相关文章

SPOJ GSS系列 解题报告

这个系列总共有7道题,目前只做了3道,gss2比较难,gss4是暴力修改,树状数组维护,还没写,gss6和gss7还不在能力范围内. SPOJ_1043 GSS1 题意:给定长度不超过5万的序列,M次查询(貌似没给大小?..),查询所给区间内的最大子段和. 做法:线段树.维护区间和sum,区间可以得到的最大值smax,从区间最左边开始的最大和lmax和右边开始的rmax,然后就可以了.具体更新还是看代码吧.比较巧妙的在于,把query函数的类型设为线段树的节点类型,这样就可以把它的子区间用upd

SPOJ GSS系列解题报告

众所周知,\(GSS\)是用来练习线段树的一个非常好的系列. 依稀记得\(8\)月初还在\(qbxt\)时,某钟姓神仙说过 :"大家可以把\(GSS\)系列写一下,大概够大家写一个月了."虽然我很不想承认,但他确实说中了\(--\)虽然中间夹有做各种杂题和一些模拟赛\(--\) 题解 GSS 1 \(GSS\)系列最简单的一道题,也算是后面题目的一个基础. 给定一个序列,维护区间最大子段和. 我们维护这样几个东西\(:lsum, rsum, maxsum, maxval.\) 分别表示

bzoj3159: 决战 树链剖分+splay

方法很简单,树剖,把区间提取出来,打翻转标记,再放回去. 注意:由于某种原因,我写的是把题目中的r忽略掉的一般情况,否则简单得多. 于是本以为写起来也很简单ovo 结果发现非常繁琐,最后写得又长跑得又慢. #include<bits/stdc++.h> #define L(t) (t)->c[0] #define R(t) (t)->c[1] #define Z(t) (L(t)->s+1) #define N 50005 #define M (s+t>>1) #

CF487E Tourists 圆方树、树链剖分

传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就是一个反例 上面这个图如果缩点双会缩成\(3\)个,但是缩边双会将整个图缩成\(1\)个点. 假如我们询问的是\((1,4)\)之间的简单路径,而图中权值最小的点为\(7\)号点,那么如果缩成了边双联通分量,你的答案会是\(7\)号点的权值,意即认为可以走到\(7\)号点,但实际上如果到\(7\)号

SPOJ 1043 Can you answer these queries I 求任意区间最大连续子段和 线段树

题目链接:点击打开链接 维护区间左起连续的最大和,右起连续的和.. #include <cstdio> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include <vector> #include <map> using namespace std; #define N 50050 #define Lson

SPOJ 375 QTREE系列-Query on a tree (树链剖分)

题目地址:SPOJ 375 树链剖分第一发! 果然是个貌似很高级的数据结构,其实就是把树的边从树形结构转化成了线性结构,从而可以用线段树或树状数组之类的数据结构进行快速维护.从而将时间缩到n*log(2*n). 这题用的线段树维护的. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #incl

SPOJ - QTREE 375 Query on a tree 树链剖分+线段树

操作1:修改第k条边权. 操作2:询问两点间最大边权. 树链剖分,然后线段树维护最大值 #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<set> #include<map> #include<queue> #include<vector> #inclu

SPOJ QTREE Query on a tree ——树链剖分 线段树

[题目分析] 垃圾vjudge又挂了. 树链剖分裸题. 垃圾spoj,交了好几次,基本没改动却过了. [代码](自带常数,是别人的2倍左右) #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 20005 int T,n,fr[maxn],h[maxn],to[maxn],ne[maxn]

SPOJ QTREE系列 树上分治问题。

375.Query on a tree  [QTREE] 有两个操作: (1)修改第i条边的边权 (2)询问a到b路径上的边权最大值. 树链剖分入门题.树链剖分+线段树维护最大值.修改/查询均为O(log^2). 很懒,没有写. 913.Query on a tree II [QTREE2] 有两个操作: (1)询问a到b的距离. (2)询问a到b路径上的第k个点. 很容易想到倍增LCA. 路径上的第k个点,要么是a的第k个父亲,要么是b的第k'个父亲,同样可以倍增实现. 询问都是O(logn)