线段树+Lazy标记(我的模版)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define INF 0X3f3f3f3f
const ll MAXN = 2e5 + ;
const ll MOD = 1e9 + ;
ll a[MAXN];
struct node
{
int left, right; //区间端点
ll max, sum; //看题目要求
ll lazy;
void update(ll x)
{
sum += (right - left + ) * x;
lazy += x;
}
} tree[MAXN << ];
//建树,开四倍
void push_up(int x)
{
tree[x].sum = tree[x << ].sum + tree[x << | ].sum;
tree[x].max = max(tree[x << ].max, tree[x << | ].max);
}
void push_down(int x)
{
ll lazeval = tree[x].lazy;
if (lazeval)
{
tree[x << ].update(lazeval);
tree[x << | ].update(lazeval);
tree[x].lazy = ;
}
}
//若原数组从a[1]~a[n],调用build(1,1,n);
void build(int x, int l, int r)
{
tree[x].left = l;
tree[x].right = r;
tree[x].sum = tree[x].lazy = ;
if (l == r) //若到达叶节点
{
tree[x].sum = a[l]; //存储A数组的值
tree[x].max = a[l];
}
else
{
int mid = (l + r) / ;
build(x << , l, mid);
build(x << | , mid + , r);
push_up(x);
}
return;
}
//update(1,l,r,v)
void update(int x, int l, int r, ll v) //区间更新
{
int L = tree[x].left, R = tree[x].right;
if (l <= L && R <= r)
{
tree[x].update(v);
tree[x].max += v;
}
else
{
push_down(x);
int mid = (L + R) / ;
if (mid >= l)
update(x << , l, r, v);
if (r > mid)
update(x << | , l, r, v);
push_up(x);
}
}
//单点更新,更新pos点,调用add(1,pos,v)
void add(int x, int pos, ll v) //当前更新的节点的编号为id(一般是以1为第一个编号)。pos为需要更新的点的位置,v为修改的值的大小
{ int L = tree[x].left, R = tree[x].right;
if (L == pos && R == pos) //左右端点均和pos相等,说明找到了pos所在的叶子节点
{
tree[x].sum += v;
tree[x].max += v;
return; //找到了叶子节点就不需要在向下寻找了
}
int mid = (L + R) / ;
if (pos <= mid)
add(x << , pos, v);
else
add(x << | , pos, v); //寻找k所在的子区间
push_up(x); //向上更新
}
//调用query_sum(1,l,r)即可查询[l,r]区间内元素的总和
//区间查询
ll query_sum(int x, int l, int r)
{
int L = tree[x].left, R = tree[x].right;
if (l <= L && R <= r)
return tree[x].sum;
else
{
push_down(x);
ll ans = ;
int mid = (L + R) / ;
if (mid >= l)
ans += query_sum(x << , l, r);
if (r > mid)
ans += query_sum(x << | , l, r);
push_up(x);
return ans;
}
}
//调用query_max(1,l,r)即可求[l,r]区间内元素的最大值
ll query_max(int x, int l, int r)
{
int L = tree[x].left, R = tree[x].right;
if (l == L && R == r)
return tree[x].max;
else
{
push_down(x);
int mid = (L + R) / ;
if (r <= mid)
return query_max(x << , l, r);
else if (l > mid)
return query_max(x << | , l, r);
else
return max(query_max(x << , l, mid), query_max(x << | , mid+, r));
}
}
int main()
{
ll n, m;
while (scanf("%lld%lld", &n, &m) != EOF)
{
for (int i = ; i <= n; i++)
scanf("%lld", &a[i]);
build(, , n);
getchar();
while (m--)
{
int l, r;
char que;
scanf("%c %d %d", &que, &l, &r);
getchar();
if (que == 'Q')
printf("%lld\n", query_max(, l, r));
else if (que == 'U')
update(, l,l, r - a[l]),a[l]=r;
}
}
return ;
}
线段树+Lazy标记(我的模版)的更多相关文章
- poj3468 线段树+lazy标记
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 92921 ...
- POJ3237 Tree(树剖+线段树+lazy标记)
You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbe ...
- 线段树+lazy标记 2019年8月10日计蒜客联盟周赛 C.小A的题
题目链接:https://nanti.jisuanke.com/t/40852 题意:给定一个01串s,进行m次操作,|s|<=1e6,m<=5e5 操作有两种 l r 0,区间[l,r] ...
- HDU_1698 Just a Hook(线段树+lazy标记)
pid=1698">题目请点我 题解: 接触到的第一到区间更新,须要用到lazy标记.典型的区间着色问题. lazy标记详情请參考博客:http://ju.outofmemory.cn ...
- POJ 3225 线段树+lazy标记
lazy写崩了--. 查了好久 /* U-> [l,r]–>1 I-> [1,l-1] [r+1,+无穷] –>0 D-> [l,r]–>0 C-> [1,l ...
- C++-POJ2777-Count Color[线段树][lazy标记][区间修改]
分析:https://www.bilibili.com/read/cv4777102 #include <cstdio> #include <algorithm> using ...
- 线段树lazy标记??Hdu4902
Nice boat Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...
- hdu-3397 Sequence operation 线段树多种标记
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3397 题目大意: 0 a b表示a-b区间置为0 1 a b表示a-b区间置为1 2 a b表示a- ...
- HDU 3468:A Simple Problem with Integers(线段树+延迟标记)
A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...
随机推荐
- 异步加载css 和 谷歌浏览器各实用小工具介绍
异步加载css资源 加开页面首屏显示速度使我们前端一直在追求的目标,而css资源在这些优化中同样也是不可或缺的. 一个网站可能有一部分css资源是必须的,他需要在页面渲染完之前就被加载完,并和html ...
- Github安装和使用(超级详细)
Github (原创:黑小子-余) 小编我是一名Git新手,然后花三天时间通过查找网上资料,了解Git的简单使用.本次我就实战操作git安装.github仓库创建.上传代码到github上.从gith ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- $[TJOI2017]$ 可乐 矩阵优化$dp$
\(Sol\) 设\(f_i\)为到第\(i\)秒的方案数,显然\(f_i=\)在第\(i\)秒前爆炸的方案数+在第\(i\)秒爆炸的方案数+在第\(i\)秒停下的方案数+在第\(i\)秒走向下一个城 ...
- [NoSQL] 从模型关系看 Mongodb 的选择理由
往期:Mongodb攻略 回顾 Mongodb 与关系型数据库的对应关系: MySQL MongoDB database(数据库) database(数据库) table(表) collectio ...
- ReentrantLock 源码分析从入门到入土
回答一个问题 在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕 ...
- 「BZOJ1722」「Usaco2006 Mar」Milk Team Select产奶比赛 解题报告
Milk Team Select 产奶比赛 Description Farmer John's N (\(1 \le N \le 500\)) cows are trying to select th ...
- 量化投资学习笔记07——python知识补漏
看<量化投资:以python为工具>这本书,第一部分是python的基础知识.这一部分略读了,只看我还不知道或不熟的. 定义复数 x = complex(2, 5) #2+5j 也可以直接 ...
- 简简单单之Linux命令入门
show me the code and talk to me,做的出来更要说的明白 GitHub 项目JavaHouse同步收录 我是布尔bl,你的支持是我分享的动力! 引入 作为一名合格的后端开发 ...
- winds消息大全
本文链接:https://blog.csdn.net/testcs_dn/article/details/42360547 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如, ...