线段树+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, ... ...
随机推荐
- from __future__ import print_function的使用
1.作用:把下一个新版本的特性导入到当前版本,就可以在当前版本中测试一些新版本的语法特性,例如在python2的环境下加入这一句可以测试python3的输出语法 2.使用方式:置于程序的第一行 3.示 ...
- JMeter Webservice API测试计划
Web Services Web服务被定义为旨在通过网络支持两台机器之间交互的软件系统.它被设计为具有以通常在Web服务描述语言(WSDL)中指定的机器可处理格式描述的接口. 通常,“HTTP”是最常 ...
- Python正则表达式之findall疑点
在findall中使用()进行分组时,得出的结果会优先提取分组的,比如下面这个例子 In [46]: re.findall(r"www.(baidu|163).com", &quo ...
- 第二阶段:2.商业需求分析及BRD:1.产品需求管理
产品经理需要投入大量的时间在需求方面的工作. 一张图看出需求多么重要.各个方面的人物对需求的误解导致的后果. 首先收集需求 需求采集 可以用excel收集数据并整理 备注信息也很重要 有时候要跟提出人 ...
- Oracle和可视化视图工具教程
Oracle数据库安装教程 作者:黑小子-余 Qq:2931445528 微信:Y2931445528 可以找我,我有Oracle数据库安装包及工具 命令: Sqlplus /nolog Conn ...
- 【退役记】CSP2019 退役记
Day -1 机房自习,因为一些奇怪原因心不在焉 我可能太在意csp了 晚上有点扛不住去七楼阳台思考人生,得到了一些惊人的结论想下来由于某种原因继续跑到七楼思考人生 然后晚自习下课仰天大笑出门去,我辈 ...
- 博帝飚速盘 16G
设备制造商: Patriot Memory当前协议 : USB2.0输入电流 : 300mA 芯片制造商: 群联(Phison)芯片型号 : PS2251-38闪存颗粒 : 美光( ...
- php strcmp函数漏洞
strcmp函数漏洞 适用5.3版本以前的php 函数作用:字符串比较 要求传入字符串.如果传入非字符串呢? 结果函数报错!但是函数返回“0” . 虽然报错了但函数的判断却是“相等” 如何传入非字符 ...
- java 实现敏感词(sensitive word)工具详解使用说明
sensitive-word 平时工作中,只要涉及到用户可以自由发言(博客.文档.论坛),就要考虑内容的敏感性处理. sensitive-word 基于 DFA 算法实现的高性能敏感词工具.工具使用 ...
- PPP协议 PAP认证