线段树lazy模板 luogu3372
线段树写得很少,这么基本的算法还是要会的……
#include<bits/stdc++.h>
using namespace std;
inline long long read() {
long long x = , f = ; char ch = getchar();
while (ch<'' || ch>'') { if (ch == '-') f = -;ch = getchar(); }
while (ch >= ''&&ch <= '') { x = x * + ch - '';ch = getchar(); }
return x*f;
}
const int maxn = ;
int n,m,op,_l,_r,k;
struct NODE{
int l,r;
long long lazy,val;
}node[maxn<<];
void pushup(int rt){
node[rt].val = node[rt<<].val+node[rt<<|].val;
}
void pushdown(int rt){
if(!node[rt].lazy) return ;
int mid = node[rt].l+node[rt].r >>;
node[rt<<].lazy += node[rt].lazy;
node[rt<<|].lazy += node[rt].lazy;
node[rt<<].val += node[rt].lazy*(mid-node[rt].l+);
node[rt<<|].val += node[rt].lazy*(node[rt].r-mid);
node[rt].lazy = ; }
void build(int x,int l,int r){
if((node[x].l = l) == (node[x].r = r)) return;
int mid = node[x].l+node[x].r>>;
build(x<<,l,mid),build(x<<|,mid+,r);
}
//单点更新
void add_one(int rt,int pos,long long val){
if(node[rt].l == node[rt].r){
node[rt].val+=val;
return;
}
int mid = node[rt].l+node[rt].r>>;
add_one(rt<<|pos>mid,pos,val);
pushup(rt);
}
//区域更新
//所谓lazy就是只有当需要pushdown时才pushdown,query同
void add(int rt,int l,int r,int val){
pushdown(rt); // 这一行的作用见 https://jecvay.com/2014/11/segment-tree-lazy-design.html
if(node[rt].l>=l && node[rt].r<=r){
node[rt].val+=val*(node[rt].r-node[rt].l+);
node[rt].lazy += val;
return ;
}
int mid = node[rt].l+node[rt].r>>;
if(l<=mid) add(rt<<,l,r,val);
if(r>mid) add(rt<<|,l,r,val);
pushup(rt);
}
long long query(int rt,int l,int r){
pushdown(rt);
if(node[rt].l>=l && node[rt].r<=r) return node[rt].val;
int mid = node[rt].l + node[rt].r >> ;
long long ans = ;
if(l<=mid) ans+=query(rt<<,l,r); // 易错
if(r>mid) ans+=query(rt<<|,l,r);
return ans;
}
int main(){
n = read(), m = read();
build(,,n);
for(int i = ;i<n;i++) add_one(,i,read());
for(int i = ;i<m;i++){
op = read();_l = read()-; _r = read()-;
if(op-) printf("%lld\n",query(,_l,_r));
else{
k = read();
add(,_l,_r,k);
}
}
return ;
}
线段树lazy模板 luogu3372的更多相关文章
- JuQueen(线段树 lazy)
JuQueen Time Limit: 5 Sec Memory Limit: 512 MB Description Input Output Sample Input 10 10 5 state ...
- 分块+lazy 或者 线段树+lazy Codeforces Round #254 (Div. 2) E
E. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- POJ 2777——线段树Lazy的重要性
POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...
- poj 3237 树链剖分模板(用到线段树lazy操作)
/* 本体在spoj375的基础上加了一些操作,用到线段树的lazy操作模板类型 */ #include<stdio.h> #include<string.h> #includ ...
- HDU 3954 Level up(多颗线段树+lazy操作)
又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...
- 矩形面积并-扫描线 线段树 离散化 模板-poj1151 hdu1542
今天刚看到这个模板我是懵逼的,这个线段树既没有建树,也没有查询,只有一个update,而且区间成段更新也没有lazy标记....研究了一下午,我突然我发现我以前根本不懂扫描线,之所以没有lazy标记, ...
- 线段树--线段树【模板1】P3372
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
- poj3468 线段树+lazy标记
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 92921 ...
随机推荐
- ubuntu 18.04安装mysql 8
wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb sudo dpkg -i mysql-apt-config_0. ...
- ELK之elasticsearch7版本集群设置
ELK7版本搭建参考:https://www.cnblogs.com/minseo/p/10948632.html node-1已经安装配置好 配置文件如下 [root@salt-test conf. ...
- 实现一个Promise
实现一个Promise promise特点 一个promise的当前状态只能是pending.fulfilled和rejected三种之一.状态改变只能是pending到fulfilled或者pend ...
- C语言获取文件大小相关操作
C语言获取文件大小相关操作 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明 通常在希望从文件中把数据全都出来赋值给一个数组或者某一个指针,然后再进行相关 ...
- hdu 1006 Tick and Tick
Tick and Tick Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- go打印九九乘法表
package main import ( "fmt" ) func main() { for i := 1; i < 10; i++ { for j := 1; j < ...
- 【leetcode算法-简单】27. 移除元素
[题目描述] 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空 ...
- 什么是HybridDB for MySQL (原PetaData)
云数据库HybridDB for MySQL (原名PetaData)是同时支持海量数据在线事务(OLTP)和在线分析(OLAP)的HTAP(Hybrid Transaction/Analytical ...
- Paypal、Stripe、Braintree,跨境电商金流第三方支付该用哪家?
在台湾做跨境电子商务生意,电商网站的金流肯定是一个最大的麻烦,Paypal或是Stripe和Braintree则是国际上大家最常用的金流整合第三方支付服务商.这些金流服务大幅简化网站付费过程,都让消费 ...
- JAVA支持字符编码读取文件
文件操作,在java中很常用,对于存在特定编码的文件,则需要根据字符编码进行读取,要不容易出现乱码 /** * 读取文件 * @param filePath 文件路径 */ public static ...