AcWing245. 你能回答这些问题吗 线段树详解
创始人
2024-02-17 19:36:46

3.2线段树

在这里插入图片描述

例题分析

245. 你能回答这些问题吗 - AcWing题库

**题意:**给一条序列,如何动态维护区间的最大子段和,包括询问某区间的最大字段和和修改某个数。

分析:线段树struct保留什么信息。能否通过左右儿子的这些信息求出父节点的所有信息。

首先毋庸置疑的是左右端点和最大连续子段和。

struct node{int l,r;int tmax;
}

然后我们思考,能不能得到父节点的信息。

​ 如图,假设我们已知左右孩子的最大子段和,同时假设父节点的最大字段和为图中绿色区域,我们发现,父节点的最大连续子段和可能是跨区间的,我们没办法通过孩子的信息得到父亲的信息,所以我们考虑添加维护的信息。

我们维护每个区间的最大前缀和和最大后缀和,如下图,横跨整个区间的子段和可以通过左边的最大后缀和加上右边的最大前缀和得到。

此时我们的结构体变成了这样:

struct node{int l,r;int tmax;//区间的最大字段和int lmax;//区间的最大前缀和int rmax;//区间的最大后缀和
}

那我们再回到刚才的思考,通过这些信息如何得到父节点的信息。

​ 那么,结合三个信息,我们可以用三个值(左儿子的最大子段和、右儿子的最大子段和、左儿子的最大后缀和加右儿子的最大前缀和)取max来得到。这里信息全面吗?答案是全面的,不过是对于区间最大子段和来说;假设最大子段和在左区间,那么(如下图)1、2、3区间(前缀、中间、后缀)能够完全表示,4、5、6同理,除了这些情况,再加上跨区间的情况,那么这些情况取max就是确定的最大值。

接下来我们再思考,我们新加入的两个信息是否能通过儿子节点求出来, 假设我们的最大前缀和是跨区间的时候,那么情况变成了这样,所以我们还需要加一个信息:区间和。

而区间和我们是可以直接求的,因此,我们每个信息都能得到了,分析完毕。

struct node{int l,r;int tmax;//区间的最大字段和int lmax;//区间的最大前缀和int rmax;//区间的最大后缀和int sum;//区间和
}

思考模式:首先我们想如何得到我们想要的答案,当添加了想要的信息之后,还要思考如何得到想要的信息,最后直到全部信息都能通过左右孩子得到。

参考代码:

#include 
using namespace std;const int N = 5e6 + 5;
vector ve(N);
int n, k;struct node {int l, r;int tmax;//区间的最大字段和int lmax;//区间的最大前缀和int rmax;//区间的最大后缀和int sum;//区间和
} tr[4 * N];void pushup(node& u, node& l, node& r) {//函数重载u.tmax = max(max(l.tmax, r.tmax), l.rmax + r.lmax);u.lmax = max(l.lmax, l.sum + r.lmax);u.rmax = max(r.rmax, r.sum + l.rmax);u.sum = l.sum + r.sum;
}void pushup(int u) {pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}void build(int u, int l, int r) {if (l == r) {tr[u]={l,r,ve[l],ve[l],ve[l],ve[l]};//到子节点直接存下所有信息return;}tr[u] = {l, r};int mid = l + r >> 1;build(u << 1, l, mid);build(u << 1 | 1, mid + 1, r);pushup(u);//这里想要pushup
}node query(int u, int l, int r) {if (tr[u].l >= l && tr[u].r <= r)return tr[u];int mid = tr[u].l + tr[u].r >> 1;if (r <= mid)return query(u << 1, l, r);//答案完全在左区间else if (l > mid)return query(u << 1 | 1, l, r);//答案完全在右区间else{auto R = query(u << 1, l, r);auto L=query(u << 1 | 1, l, r); //答案想要左右区间的信息合并才能得到node res;pushup(res, R, L);//合并左右区间信息return res;}
}void modify(int u,int x,int val){if(tr[u].l==x&&tr[u].r==x)tr[u] = {x,x,val,val,val,val};else{int mid = tr[u].l + tr[u].r >> 1;if(x<=mid)modify(u << 1, x, val);elsemodify(u << 1 | 1, x, val);pushup(u);}
}int main() {cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> ve[i];}//cout << "x" <int q;cin >> q;if (q == 1) {int l, r;cin >> l >> r;if(l>r)swap(l, r);cout<int x, y;cin >> x >> y;modify(1, x, y);}}
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...