牛客-小H的询问(线段树)
原题链接:更好的阅读体验
题目描述
小H给你一个数组{a},要求支持以下两种操作:
0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认为是有效的当且仅当这个子区间中没有两个相邻的偶数或者奇数。
1 x v(1<=x<=n,-109<=v<=109),将a[x]的值修改为v。
输入描述:
第一行读入两个正整数n,m(1<=n,m<=105)
第二行读入n个整数,第i个表示a[i](-109 <= a[i] <= 109)
接下来m行,每行三个数表示操作,描述见题目描述。
输出描述:
输出每个询问的答案。
示例1
输入
复制
10 10
-9 -8 -8 -8 2 -7 -5 2 2 3
0 3 5
0 4 4
0 2 4
1 6 6
1 1 6
1 5 9
0 1 2
1 5 -8
0 2 4
1 3 -2
输出
复制
2
-8
-8
6
-8
思路:
一般用线段树的话,就是通过增加维护的东西来达到目的,这个题比维护最大连续子段和的题多了一个限制奇偶的条件,只需要在结构体中加入flag标记即可。
/**
用线段树维护一个区间的和,
区间是否有效,
区间的左端和右端的奇偶性,
区间左端和右端开始的最大的有效子区间的和,
区间里最大的有效子区间的和,
**/
ps:以后还是少用结构体全部赋值,少了个v找了半小时bug
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline void read(ll &x){ll s = 0, w = 1; char ch = getchar();while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); }while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();x = s*w;
}
const int maxn=1e6+7;
struct node{ll flag;///该区间是否有效ll sum;///区间的和ll suml,sumr,maxsum;///左端开始的最大有效子区间和,右端,总的ll flagl,flagr;///左右区间的奇偶:1奇0偶
}a[maxn*4];
ll n,m;
ll vis[maxn];
void pushup(ll u){auto l=a[u<<1],r=a[u<<1|1],&x=a[u];x.flag=0;x.maxsum=max(l.maxsum,r.maxsum);///维护区间有效最大值x.flagl=l.flagl;x.flagr=r.flagr;///维护区间端点的奇偶性x.suml=l.suml;x.sumr=r.sumr;///维护左端开始的最大有效子区间和///以上都是区间未合并时的情况if(l.flagr^r.flagl){///区间可合并x.maxsum=max(x.maxsum,l.sumr+r.suml);if(r.flag) x.sumr=max(x.sumr,l.sumr+r.sum);///如果右边区间合法,总区间的从右端区间开始的合法区间是右边区间和左边区间的从右开始的合法部分if(l.flag) x.suml=max(x.suml,r.suml+l.sum);if(l.flag&&r.flag){x.flag=1;x.sum=l.sum+r.sum;}}
}
node qupdate(node l,node r){node x;x.flag=0;x.maxsum=max(l.maxsum,r.maxsum);///维护区间有效最大值x.flagl=l.flagl;x.flagr=r.flagr;///维护区间端点的奇偶性x.suml=l.suml;x.sumr=r.sumr;///维护左端开始的最大有效子区间和///以上都是区间未合并时的情况if(l.flagr^r.flagl){///区间可合并x.maxsum=max(x.maxsum,l.sumr+r.suml);if(r.flag) x.sumr=max(x.sumr,l.sumr+r.sum);///如果右边区间合法,总区间的从右端区间开始的合法区间是右边区间和左边区间的从右开始的合法部分if(l.flag) x.suml=max(x.suml,r.suml+l.sum);if(l.flag&&r.flag){x.flag=1;x.sum=l.sum+r.sum;}}return x;
}
void build(ll u,ll l,ll r){if(l==r)a[u]={1,vis[l],vis[l],vis[l],vis[l],vis[l]&1,vis[l]&1};else{int mid=(l+r)>>1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);pushup(u);}
}
/**
struct node{bool flag;///该区间是否有效ll sum;///区间的和ll suml,sumr,maxsum;///左端开始的最大有效子区间和,右端,总的bool flagl,flagr;///左右区间的奇偶:1奇0偶
}a[maxn*4];
**/
void update(int u,int l,int r,int x,int v){if(l==r)a[u]={1,v,v,v,v,v&1,v&1};else{int mid=(l+r)>>1;if(x<=mid) update(u<<1,l,mid,x,v);else update(u<<1|1,mid+1,r,x,v);pushup(u);}
}
node qask(int u,int l,int r,int x,int y){if(x<=l&&y>=r) return a[u];int mid=(l+r)>>1;if(y<=mid) return qask(u<<1,l,mid,x,y);else if(x>mid) return qask(u<<1|1,mid+1,r,x,y);else return qupdate(qask(u<<1,l,mid,x,y),qask(u<<1|1,mid+1,r,x,y));
}
int main(){cin>>n>>m;for(ll i=1;i<=n;i++) cin>>vis[i];build(1,1,n);ll op,x,y;while(m--){cin>>op>>x>>y;if(!op) printf("%lld\n",qask(1,1,n,x,y).maxsum);else update(1,1,n,x,y);}return 0;
}
牛客-小H的询问(线段树)相关推荐
- 牛客-小H和游戏(树的dfs)
原题链接 解题思路:思路见代码,如还有疑惑.请评论区留言 C++代码 #include <bits/stdc++.h> // #define int long long using nam ...
- 牛客网wannafly挑战赛13-E(线段树)
链接:https://www.nowcoder.com/acm/contest/80/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客练习赛 4 A-Laptop (线段树,思维/GTMD普通前缀和也能求)
链接:https://ac.nowcoder.com/acm/contest/16/A?&headNav=www 来源:牛客网 题目描述 FST是一名可怜的小朋友,他很强,但是经常fst,所以 ...
- 牛客小白9 换个角度思考(离线+树状数组)
title: 牛客小白9 换个角度思考(离线+树状数组) date: 2018-11-29 15:25:18 tags: [离线,树状数组] categories: ACM 题目链接 题目描述 给定一 ...
- 牛客小d和孤独的区间
牛客小d和孤独的区间 这道题我们如果等到数据都输入完后再计算会浪费很多时间 所以还是每次输入都计算一遍 我们知道要找到一个区间里只有一个1,其余都是0 所以这时候我们可以将输入分为两种情况 1,输入为 ...
- 刷题记录:牛客NC15162小H的询问
传送门:牛客 题目描述: 小H给你一个数组{a},要求支持以下两种操作: 1. 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认 ...
- 牛客—— 小A的最短路 (LCA)
[牛客] 小A的最短路 (LCA) 原题链接 题意: 给定一棵树,除给定的特殊边边权为0外,其余边权均为1.求两点之间的最短距离.n为3e5 思路: 今天碰到的第一道喜欢的题hhhhhh 题目是一棵树 ...
- SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)
题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...
- 牛客-小a与星际探索
这是一道伪图论题 链接:https://ac.nowcoder.com/acm/problem/22144 来源:牛客网 题目描述 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往n ...
最新文章
- 看腾讯运维应对“18岁照片全民怀旧”事件的方案,你一定不后悔!
- 百度15篇论文被AAAI 2019收录
- Struts2动态方法调用
- 步进电机的单双极驱动
- django_rest_framework之GenericAPIView(三)
- java biginteger转int_如何在不使用java.math.BigInteger的情况下使用Java处理非常大的数字...
- java设置图书管理系统界面设计_java 图书管理系统 界面漂亮 绝对好用
- rake -T 列出所有RAKE 命令.
- ud分区删除工具_硬盘分区GPT分区怎么转MBR呢?硬盘分区GPT分区转MBR教程
- SpringMVC中的异步请求-跨域访问
- OpenCV计算机视觉实战(Python版)_004图像形态学处理
- HDU——3579 Hello Kiki
- 手动修改Icon图标的颜色深度(张佩)
- win10系统CUDA10.0安装教程(for tensorflow2.0)
- 数独基本规则_数独游戏规则?
- Microsoft Office Word无法执行语言识别怎么办
- ubuntu 18.04 安装搜狗拼音输入法(没有坑)
- pip下载镜像源汇总
- java控制分屏_java实现arcgis地图分屏(双图)
- 信息学奥赛一本通2063
热门文章
- Hexo 博客加入豆瓣读书界面(综合教程)
- 大学生实习就业调研报告之一 - 调研数据统计和分析
- 服务器系统蓝屏进不去怎么办,蓝屏无法进入任何模式怎么办_网站服务器运行维护,蓝屏...
- 数据结构与算法——经典题目(5)锻造兵器
- 重装系统后固态硬盘不见了如何解决
- 计算机网络毕业设计关于flash,《电大计算机网络毕业论文FLASH爱好者网站;的网页设计与制作》.doc...
- Cisco ISO 下载地址汇总
- F3arRa1n更新4.4.3版本,支持IOS12.0~14.8免费绕过
- 是非人生 — 一个菜鸟程序员的5年职场路 第20节
- 运营入门:全攻略,且不仅是入门