给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:

1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=lrA[i]}。

2、“2 x y”,把 A[x] 改成 y。

对于每个查询指令,输出一个整数表示答案。

输入格式

第一行两个整数N,M。

第二行N个整数A[i]。

接下来M行每行3个整数k,x,y,k=1表示查询(此时如果x>y,请交换x,y),k=2表示修改。

输出格式

对于每个查询指令输出一个整数表示答案。

每个答案占一行。

数据范围

N≤500000,M≤100000N≤500000,M≤100000

输入样例:

5 3
1 2 -3 4 5
1 2 3
2 2 -1
1 3 2

输出样例:

2
-1
#include<bits/stdc++.h>
using namespace std;#define ll long long
#define eps 1e-9const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
const int maxn = 500000 + 8;int n, m, k, x, y;
ll a[maxn];struct node
{int l, r;ll sum, dat, lmax, rmax;
}tree[4 * maxn];void push_down(int i)
{tree[i].sum = tree[i * 2].sum + tree[i * 2 + 1].sum;tree[i].lmax = max(tree[i * 2].lmax, tree[i * 2].sum + tree[i * 2 + 1].lmax);///紧靠左端的最大连续子段和tree[i].rmax = max(tree[i * 2 + 1].rmax, tree[i * 2 + 1].sum + tree[i * 2].rmax);///紧靠右端的最大连续子段和tree[i].dat = max(tree[i * 2].dat, max(tree[i * 2 + 1].dat, tree[i * 2].rmax + tree[i * 2 + 1].lmax));///区间连续最大字段和
}void build(int i, int l, int r)
{tree[i].l = l;tree[i].r = r;if(l == r){tree[i].sum = a[l];tree[i].dat = a[l];tree[i].lmax = a[l];tree[i].rmax = a[l];return;}int mid = (l + r) / 2;build(i * 2, l, mid);build(i * 2 + 1, mid + 1, r);push_down(i);
}void change(int i, int pos, int k)
{if(tree[i].l == tree[i].r){tree[i].sum = k;tree[i].sum = k;tree[i].dat = k;tree[i].lmax = k;tree[i].rmax = k;return;}int mid = (tree[i].l + tree[i].r) / 2;if(pos <= mid)change(i * 2, pos, k);elsechange(i * 2 + 1, pos, k);push_down(i);
}node tmp;node search(int i, int l, int r)
{if(tree[i].l >= l && tree[i].r <= r){return tree[i];}node a, b, c;a.dat = a.lmax = a.rmax = a.sum = -inf;///左儿子b.dat = b.lmax = b.rmax = b.sum = -inf;///右儿子c.dat = c.lmax = c.rmax = -inf;///父节点c.sum = 0;int mid = (tree[i].l + tree[i].r) / 2;if(l <= mid && r <= mid){a = search(i * 2, l, r);c.sum += a.sum;}else if(mid < r && mid < l){b = search(i * 2 + 1, l, r);c.sum += b.sum;}else{a = search(i * 2, l, r);b = search(i * 2 + 1, l, r);c.sum += a.sum + b.sum;}c.dat = max(c.dat, max(a.rmax + b.lmax, max(a.dat, b.dat)));///区间连续最大字段和c.lmax = max(c.lmax, max(a.lmax, a.sum + b.lmax));///紧靠左端的最大连续子段和c.rmax = max(c.rmax, max(b.rmax, b.sum + a.rmax));///紧靠右端的最大连续子段和return c;
}int main()
{std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i = 1; i <= n; i++)cin>>a[i];build(1, 1, n);for(int i = 0; i < m; i++){cin>>k>>x>>y;if(k == 1){if(x > y)swap(x, y);cout<<search(1, x, y).dat<<'\n';}else if(k == 2){a[x] = y;change(1, x, y);}}return 0;
}

转载于:https://www.cnblogs.com/RootVount/p/11432182.html

ACwing 245. 你能回答这些问题吗(线段树区间子段最大值+单点修改)相关推荐

  1. 线段树——你能回答这些问题吗?(经典应用)

    传送门:245. 你能回答这些问题吗 - AcWing题库 思路: 1.在存储的结构体里面加一个sum用于记录当前节点区间的区间和,当前节点p的区间和就是两个子节点的区间和. t[p].sum=t[p ...

  2. AcWing - 246. 区间最大公约数(树状数组+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,需要执行 mmm 次操作,每次操作分为下列两种类型: C l r d:将区间 [l,r][l,r][l,r] 位置的数字都加上 ddd Q ...

  3. 树状数组、线段树、分块 在同一题目中的应用(Acwing 243)

    Acwing 243 输入样例: 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 输出样例: 4 55 9 15 树状数组做法 # ...

  4. AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

    文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...

  5. ug在哪看服务器运行,【1人回答】UG软件许可证服务器的值在哪儿修改?-3D溜溜网...

    回答: 一.在安装目录中创建一个新文件夹,然后在该文件夹中创建一个新文件夹UG存储程序来存储许可证文件. 二.根据计算机配置选择已安装程序的数量,打开相应的UGslicensing文件夹,并将nx8. ...

  6. 【Jeoy‘ s daily 】AcWing 1275. 最大数 线段树

    题目链接 给定一个正整数数列 a1,a2,-,an,每一个数都在 0∼p−1 之间. 可以对这列数进行两种操作: 添加操作:向序列后添加一个数,序列长度变成 n+1: 询问操作:询问这个序列中最后 L ...

  7. 扫描线+线段树简介 AcWing 248窗内的星星题解

    ----出自南昌理工学院ACM集训队 这周学习了线段树和扫描线的解题方法,下面由小菜鸡简介一下: 一般扫描线的题目最简单的便是扫描线裸模板(一般来说的话:数据范围小),其次的话便是进行拓展成线段树+扫 ...

  8. Acwing 4339 敌兵布阵 暴力 + 分块 + 线段树 + Zkw线段树 + 树状数组

    来一篇超全题解 数据结构大杂烩 原题连接 题目描述 敌人有 NNN 个工兵营地,编号 1∼N1∼N1∼N. 初始时,第 iii 个营地有 aia_iai​ 个人. 接下来有若干个命令,命令有 444 ...

  9. 第五讲 树状数组与线段树 【未完结】

    目录 1264. 动态求连续区间和 [树状数组板子题] 1265. 数星星 [树状数组变种] 1270. 数列区间最大值 [线段树 / 区间内求最大值] 1215. 小朋友排队 [树状数组] AcWi ...

最新文章

  1. Android应用的Tab键,来回反复点击会报ANR,是空指针导致的,判空就可以解决
  2. How to judge if one OData model data is out of date
  3. Android系统JNI的实现方式
  4. 限流算法(记录cyc大佬的专栏)
  5. makefile中的shell调用---注意事项
  6. 彻底封杀讯雷下载,做好网络管理
  7. ribbon基于接口配置超时_Spring Cloud第二篇:服务消费者RestTemplate+Ribbon
  8. 配置MatConvNet
  9. vue-awsome-swiper安装和css引入问题
  10. ros使用自动驾驶数据集KITTI【1】介绍与可视化
  11. 三立期货:掌财社重大事项停牌是利好吗?一般停多久?
  12. 走进VOT--《High Performance Visual Tracking with Siamese Region Proposal Network》阅读翻译
  13. Leetcode 1833 雪糕的最大数量
  14. ORACLE (5): buffer cache(CBC LATCH实验)
  15. 本主题的评论还有不足之处,还望海涵
  16. 戴森“新我发现所”苏州线下体验展启幕 以颠覆性科技传递护发造型新理念
  17. 文件下载成excel
  18. 鼠标经过,显示层并跟随鼠标
  19. Google OR-Tools(三) 整数优化Integer Optimization
  20. Linux下配置短信猫的方法和常见错误。

热门文章

  1. 水晶报表-横向设计页面,设置网格高度
  2. WMI介绍及简单实际运用(二,Win32_Processor内容)
  3. Python3之Django Web框架中间件???
  4. ubuntu终端彻底删除软件
  5. 使用 HTMLTestRunner.py
  6. 8个前沿的 HTML5 CSS3 效果【附源码下载】
  7. 四十六、Qt网络(六)UDP
  8. Word2013中怎样设置同一文档内粘贴选项
  9. ruby格式化SQL语句
  10. Caffe SSD Ubuntu16 04 训练自己的数据集