一.原理分析


二.例题讲解
例题1:
https://vjudge.z180.cn/problem/SPOJ-GSS1
题目大意:
给你一个长度为N的序列,再给你M次询问,每一次询问给你一个x,y
要求输出区间[x,y]的最大连续子段的和是多少.
分析:这道理就是就是最大连续子段的板子题,搞懂上面的原理分析就可以轻松解决了
AC代码:
#include<bits/stdc++.h>
#define ls dep<<1
#define rs dep<<1|1
using namespace std;
const int Maxn = 5e4+10;
int f[Maxn*4];
int lmax[Maxn*4];
int a[Maxn];
int rmax[Maxn*4];
int sum[Maxn*4];
void pushup(int dep)
{
sum[dep] = sum[ls]+sum[rs];
f[dep] = max(max(f[ls],f[rs]),rmax[ls]+lmax[rs]);
rmax[dep] = max(rmax[rs],sum[rs]+rmax[ls]);
lmax[dep] = max(lmax[ls],sum[ls]+lmax[rs]);
return ;
}
void build(int pos,int dep,int l,int r)
{
if(l==r)
{
sum[dep] = a[l];
f[dep] = a[l];
lmax[dep] = a[l];
rmax[dep] = a[l];
return ;
}
int mid = l+r>>1;
if(pos<=mid) build(pos,ls,l,mid);
else build(pos,rs,mid+1,r)

最低0.47元/天 解锁文章
1849

被折叠的 条评论
为什么被折叠?



