CDOJ1598-线段树合并(2017 UESTC Training for Data Structures G)
来源:互联网 发布:西南政法大学王洪 知乎 编辑:程序博客网 时间:2024/06/09 13:50
传送门:CDOJ1598
题目大意:
给你n个数m次操作,有两种操作
1,询问区间[a,b]的 最大连续子区间
2,将第pos个数变为X
题目思路:
线段树区间和并,对于这题我们需维护个区间和和区间最大连续和向左向右最大连续和
对于向上更新时,父区间向左向右连续和为为子区间向左向右连续和和向左向右和加上
相反区间向左向右连续和,这个就和求最大字段和一样,最大连续和左右子区间最大连续和
和中间连续和的最大值,查询这里我们用普通的方法是不行的,因为我们这里不好维左右连续
和的长度,所以查询时可能会越界,所以我们要在要查的区间里不断向右合并更新,最后就是这个
询问区间的最值,我们这里可以用个全局变量来更新查询
AC代码:
#include<bits/stdc++.h>using namespace std;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int maxn = 1e6;struct st{ int sum,summax,lsum,rsum;}Tree[maxn<<1];void pushup(int rt){ Tree[rt].lsum = max(Tree[rt<<1].lsum,Tree[rt<<1].sum+Tree[rt<<1|1].lsum); Tree[rt].rsum = max(Tree[rt<<1|1].rsum,Tree[rt<<1|1].sum+Tree[rt<<1].rsum); Tree[rt].sum = Tree[rt<<1].sum+Tree[rt<<1|1].sum; Tree[rt].summax = max(max(Tree[rt<<1].summax,Tree[rt<<1|1].summax),Tree[rt<<1].rsum+Tree[rt<<1|1].lsum);}void build(int l,int r,int rt){ if(l==r) { int x;scanf("%d",&x); Tree[rt].lsum=Tree[rt].rsum= Tree[rt].sum = Tree[rt].summax = x; return ; } int mid = (l+r)>>1; build(lson); build(rson); pushup(rt);}int lsum,rsum,sum,summax;void quary(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R) { //在查找区间内不断更新,从左到右(性质) if(summax == 1e9) { summax = Tree[rt].summax; lsum = Tree[rt].lsum; rsum = Tree[rt].rsum; sum = Tree[rt].sum; return ; } summax = max(max(summax,Tree[rt].summax),rsum+Tree[rt].lsum); lsum = max(lsum,sum+Tree[rt].lsum); rsum = max(Tree[rt].rsum,Tree[rt].sum+rsum); sum = sum+Tree[rt].sum; return ; } int mid = (l+r)>>1; if(L<=mid)quary(L,R,lson); if(R>mid)quary(L,R,rson);}void updata(int l,int r,int rt,int pos,int v){ if(l==r) { Tree[rt].lsum =v; Tree[rt].rsum=v; Tree[rt].sum=v; Tree[rt].summax=v; return ; } int mid = (l+r)>>1; if(pos<=mid) { updata(lson,pos,v); } else updata(rson,pos,v); pushup(rt);}int main(){ int n,m; scanf("%d%d",&n,&m); build(1,n,1); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a==1) { lsum = rsum = sum = summax = 1e9; quary(b,c,1,n,1); printf("%d\n",summax); } else { updata(1,n,1,b,c); } } return 0;}
阅读全文
0 0
- CDOJ1598-线段树合并(2017 UESTC Training for Data Structures G)
- 2016 UESTC Training for Data Structures A题 线段树
- CDOJ1597-线段树好题(2017 UESTC Training for Data Structures C)
- CDOJ1583-树状数组 (2017 UESTC Training for Data Structures)
- UESTC Training for Data Structures——G
- 【UESTC】2015 UESTC Training for Data Structures
- 2016 UESTC Training for Data Structures A - 卿学姐与公主 线段树
- 2016 UESTC Training for Data Structures Q - 昊昊爱运动 II 线段树+延迟操作+bitset
- 2016 UESTC Training for Data Structures A - 卿学姐与公主 CDOJ 1324 线段树
- 2016 UESTC Training for Data Structures B - 卿学姐与基本法 CDOJ 1325 线段树+离散化
- 2016 UESTC Training for Data Structures Q - 昊昊爱运动 II CDOJ 1259 线段树+bitset
- CDOJ-1592 (2017 UESTC Training for Data Structures B)
- UESTC Training for Data Structures(总结)
- 2016 UESTC Training for Data Structures
- 2016 UESTC Training for Data Structures
- 2016 UESTC Training for Data Structures (1)
- 2016 UESTC Training for Data Structures(2)
- 2016 UESTC Training for Data Structures(3)
- JavaWEB分层设计思想模式
- 推荐系统-利用用户行为数据判断用户间或商品间相似性、分类和个性化推荐
- 数据结构(Java)--树和二叉树
- 正则表达式总结 re (python演示)
- 13.5. Classes That Manage Dynamic Memory
- CDOJ1598-线段树合并(2017 UESTC Training for Data Structures G)
- HDU1166敌兵布阵 分块解法,分块练习
- javascript 对象描述符
- js 检测变量是否存在
- SSM框架--小功能整合
- python解析XML文件(基础)
- 《Python黑帽子》学习笔记
- 51Nod-1613-翻硬币
- UDP协议的简单使用