TYVJ 1427 线段树的基本操作
题意:
单点修改,区间最值
思路:
线段树
原题请戳这里
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LSON l,mid,lson
#define RSON mid+1,r,rson
#define N 500000
#define inf 0x3fffffff
using namespace std;
int n,m,jy,xx,yy,RANS,ANS;
int tree[N*4],lmax[N*4],rmax[N*4],maxx[N*4],sum[N*4];
void push_up(int pos,int lson,int rson){
sum[pos]=sum[lson]+sum[rson];
rmax[pos]=max(rmax[rson],sum[rson]+rmax[lson]);
lmax[pos]=max(lmax[lson],lmax[rson]+sum[lson]);
maxx[pos]=max(maxx[lson],max(maxx[rson],rmax[lson]+lmax[rson]));
}
void build(int l,int r,int pos){
if(l==r){
scanf("%d",&tree[pos]);
lmax[pos]=rmax[pos]=sum[pos]=maxx[pos]=tree[pos];
return;
}
int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
build(LSON);build(RSON);
push_up(pos,lson,rson);
}
void query(int l,int r,int pos){
if(l>=xx&&r<=yy){
ANS=max(ANS,max(maxx[pos],RANS+lmax[pos]));
RANS=max(rmax[pos],RANS+sum[pos]);
return;
}
int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
if(mid<xx)query(RSON);
else if(mid>=yy)query(LSON);
else query(LSON),query(RSON);
}
void update(int l,int r,int pos){
if(l==r){
lmax[pos]=rmax[pos]=sum[pos]=maxx[pos]=tree[pos]=yy;
return;
}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<xx)update(RSON);
else update(LSON);
push_up(pos,lson,rson);
}
int main(){
scanf("%d%d",&n,&m);
build(1,n,1);
while(m--){
scanf("%d%d%d",&jy,&xx,&yy);
if(jy==1){
if(xx>yy)swap(xx,yy);
ANS=RANS=-inf;
query(1,n,1);
printf("%d\n",ANS);
}
else
update(1,n,1);
}
}
TYVJ 1427 线段树的基本操作的更多相关文章
- HDOJ-1754(简单线段树)
最近开始重新学习线段树,先从最简单的开始吧! I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 ...
- 数据结构3——浅谈zkw线段树
线段树是所有数据结构中,最常用的之一.线段树的功能多样,既可以代替树状数组完成"区间和"查询,也可以完成一些所谓"动态RMQ"(可修改的区间最值问题)的操作.其 ...
- 线段树(segment_tree)
线段树之——区间修改区间查询 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lgN). 线段树是 ...
- HDU - 1698 线段树区间修改,区间查询
这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可. 我自己做的时候太傻逼了...把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右 ...
- Vasya and a Tree CodeForces - 1076E(线段树+dfs)
I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...
- CF438D 线段树 区间求和,区间求膜,单点更新
题目链接 题目大意: 给定一个长度为n的序列,要求能够执行m次下列操作: 1.查询区间[l,r]的和 2.将区间[l,r]的每一个数%=mod 3.修改第x个数为y 操作1,3都是线段树的基本操作,线 ...
- HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)
Fast Arrangement Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 【数据结构系列】线段树(Segment Tree)
一.线段树的定义 线段树,又名区间树,是一种二叉搜索树. 那么问题来了,啥是二叉搜索树呢? 对于一棵二叉树,若满足: ①它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ②若它的右子树不空, ...
- 线段树(Segment Tree)(转)
原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lg ...
随机推荐
- Assembly之example
Here is a simple example by assembly language. It is based on openMSP430. Very important is to under ...
- 学习廖雪峰的Python教程之Python基础
一.缩进 编译器或者解释器就是负责把符合语法的程序代码转换成CPU能够执行的机器码,然后执行. 以#开头的语句是注释,注释是给人看的,可以是任意内容,解释器会忽略掉注释.其他每一行都是一个语句,当语句 ...
- .NET 在序列化时使用全小写的属性名
基于某些奇怪的需求,需要将一些对象序列化后输出,而且属性名又必须为小写形式. 解决过程 说到在 .NET 平台上序列化操作,那么第一个想到的应该就是 Json.NET 家的 Newtonsoft.Js ...
- 读书笔记「Python编程:从入门到实践」_6.字典
6.1 一个简单的字典 alien_0 = {'color': 'green', 'points': 5} print(alien_0['color']) print(alien_0['points' ...
- springboot测试类
Controller测试类 /** * Created by zhiqi.shao on 2017/5/12. */ @RunWith(SpringJUnit4ClassRunner.class) @ ...
- 团体程序设计天梯赛-练习集-*L1-043. 阅览室
L1-043. 阅览室 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过100 ...
- Robot Framework(六)变量
变量 2.5.1简介 变量是Robot Framework的一个不可或缺的特性,它们可以在测试数据的大多数地方使用.最常见的是,它们用于测试用例表和关键字表中关键字的参数,但所有设置都允许在其值中使用 ...
- 莫烦大大keras学习Mnist识别(4)-----RNN
一.步骤: 导入包以及读取数据 设置参数 数据预处理 构建模型 编译模型 训练以及测试模型 二.代码: 1.导入包以及读取数据 #导入包 import numpy as np np.random.se ...
- java 定时器任务模板
1.该定时任务是基于web.xml的监听机制 listener 来实现的 建立监听类: NFDFlightDataTaskListener.java import javax.servlet.Serv ...
- PHP中把数据库查询结果输出为json格式
<?php header("Content-type:text/html;charset=utf-8");//字符编码设置 $servername = "local ...