题目描述

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

1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤y{∑ri=lA[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≤100000

输入样例:

5 3

1 2 -3 4 5

1 2 3

2 2 -1

1 3 2

输出样例:

2

-1

时/空限制:

1s / 64MB


rt。


一道挺难的线段树题。


#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 5e5 + 5;
struct seg{
int ans, sum, l, r, L, R;
#define ans(p) t[p].ans
#define sum(p) t[p].sum
#define l(p) t[p].l
#define r(p) t[p].r
#define L(p) t[p].L
#define R(p) t[p].R
}t[maxn << 2];
int num[maxn];
void build(int p, int l, int r){
l(p) = l; r(p) = r;
if(l == r){
sum(p) = ans(p) = L(p) = R(p) = num[l];
return ;
}
int mid = l + r >> 1;
build(p << 1, l, mid);
build(p << 1 | 1 , mid + 1, r);
sum(p) = sum(p << 1) + sum(p << 1 | 1);
L(p) = max(L(p << 1), sum(p << 1) + L(p << 1 | 1));
R(p) = max(R(p << 1 | 1), sum(p << 1 | 1) + R(p << 1));
int sondata = max(ans(p << 1), ans(p << 1 | 1));
ans(p) = max(sondata, L(p << 1 | 1) + R(p << 1));
}
void change(int p, int d, int k){
if(d < l(p) || d > r(p))
return ;
if(l(p) == r(p)){
sum(p) = ans(p) = L(p) = R(p) = k;
return ;
}
change(p << 1, d, k);
change(p << 1 | 1, d, k);
sum(p) = sum (p << 1) + sum (p << 1 | 1);
L(p) = max(L(p << 1), sum(p << 1) + L(p << 1 | 1));
R(p) = max(R(p << 1 | 1), sum(p << 1 | 1) + R(p << 1));
int sondata = max(ans(p << 1), ans(p << 1 | 1));
ans(p) = max(sondata, L(p << 1 | 1) + R(p << 1));
}
seg query(int p ,int l, int r){
if(l <= l(p) && r(p) <= r){
return t[p];
}
seg lson, rson, res;
int mid = l(p) + r(p) >> 1, val = -1e9;
lson = (seg){val, val, 0, 0, val, val};
rson = lson;
res.sum = 0;
if(l <= mid){
lson = query(p << 1, l, r);
res.sum += lson.sum;
}
if(mid < r){
rson = query(p << 1 | 1, l, r);
res.sum += rson.sum;
}
int answer = max(lson.ans, rson.ans);
res.ans = max(answer, lson.R + rson.L);
res.L = max(lson.L, lson.sum + rson.L);
res.R = max(rson.R, rson.sum + lson.R);
if(l > mid)
res.L = max(res.L, rson.L);
if(r <= mid)
res.R = max(res.R, lson.R);
return res;
}
signed main(){
int n, m;
scanf("%lld%lld", &n, &m);
for(int i = 1;i <= n;i ++)
scanf("%lld", &num[i]);
build(1, 1, n);
//printf ("[TESTDATA] the root rlen answer is %d. \n", R(3));
for(int i = 1;i <= m;i ++){
int x, y, z;
scanf("%lld%lld%lld", &x, &y, &z);
if(x == 1){
if(y > z)
swap(y, z);
printf("%lld\n", query(1, y, z).ans);
} else {
change(1, y, z);
}
}
return 0;
}

Acwing 245.你能回答这些问题吗的更多相关文章

  1. AcWing:245. 你能回答这些问题吗(线段树最大子段和)

    给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=l ...

  2. ACwing 你能回答这些问题吗(线段树求最大连续字段和)

    给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=l ...

  3. AcWing 244. 谜一样的牛 (树状数组+二分)打卡

    题目:https://www.acwing.com/problem/content/245/ 题意:有n只牛,现在他们按一种顺序排好,现在知道每只牛前面有几只牛比自己低,牛的身高是1-n,现在求每只牛 ...

  4. AcWing 229. 新NIM游戏 (线性基+博弈论)打卡

    题目:https://www.acwing.com/problem/content/description/231/ 题意:给出n堆石子,然后第一回合,A玩家可以随便拿多少堆石子,第二回合B玩家随便拿 ...

  5. acwing 239. 奇偶游戏 并查集

    地址  https://www.acwing.com/problem/content/241/ 小A和小B在玩一个游戏. 首先,小A写了一个由0和1组成的序列S,长度为N. 然后,小B向小A提出了M个 ...

  6. 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  7. 每日一问:面试结束时面试官问"你有什么问题需要问我呢",该如何回答?

    面试结束时面试官问"你有什么问题需要问我呢",该如何回答?

  8. python爬虫beta版之抓取知乎单页面回答(low 逼版)

    闲着无聊,逛知乎.发现想找点有意思的回答也不容易,就想说要不写个爬虫帮我把点赞数最多的给我搞下来方便阅读,也许还能做做数据分析(意淫中--) 鉴于之前用python写爬虫,帮运营人员抓取过京东的商品品 ...

  9. 用python+selenium抓取知乎今日最热和本月最热的前三个问题及每个问题的首个回答并保存至html文件

    抓取知乎今日最热和本月最热的前三个问题及每个问题的首个回答,保存至html文件,该html文件的文件名应该是20160228_zhihu_today_hot.html,也就是日期+zhihu_toda ...

随机推荐

  1. JUC---06线程间通信(二)

    二.线程间定制化调用通信 要使多线程之间按顺序调用,实现A->B->C按顺序输出,使用Lock锁实现,通过Lock锁创建三个Condition实例(三把钥匙),通过不同的条件,调用不同钥匙 ...

  2. Redis---02Redis的Java客户端

    一.注意 连接Linux里面安装的Redis,需要执行以下步骤: ①禁用防火墙(CentOS 7):systemctl stop firewalld.service ②在redis.conf中注释掉 ...

  3. Triple的使用

    public Triple<Long, Long, Double> getCarRunSummary(String did, Date startDate, Date endDate) { ...

  4. Redis中的一致性哈希问题

    在说redis中的哈希(准确来说是一致性哈希)问题之前,先来看一个问题:为什么在分布式集群中一致性哈希会得到大量应用? 在一个分布式系统中,要将数据存储到具体某个节点,或者将来自客户端的请求分配到某个 ...

  5. 835. Image Overlap —— weekly contest 84

    Image Overlap Two images A and B are given, represented as binary, square matrices of the same size. ...

  6. PAT Saving James Bond - Easy Version

    Saving James Bond - Easy Version This time let us consider the situation in the movie "Live and ...

  7. 转载-git的安装和使用

    首先是安装和配置,参考了以下博客的内容https://www.cnblogs.com/minRose/p/10286473.html 一.下载地址 https://git-scm.com/downlo ...

  8. mybatis 字符串比较 == 用法

    private String deptLevel; <when test='deptLevel=="3"'> 正确 <when test="deptLe ...

  9. 经典c程序100例==61--70

    [程序61] 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 2.程序源代码: main() ...

  10. LOJ #2005. 「SDOI2017」相关分析 线段树维护回归直线方程

    题目描述 \(Frank\) 对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. \(Frank\) 不仅喜欢观测,还喜欢分析观测到的 ...