线段树写得很少,这么基本的算法还是要会的……

#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的更多相关文章

  1. JuQueen(线段树 lazy)

    JuQueen Time Limit: 5 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 10 5 state ...

  2. 分块+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 ...

  3. POJ 2777——线段树Lazy的重要性

    POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...

  4. poj 3237 树链剖分模板(用到线段树lazy操作)

    /* 本体在spoj375的基础上加了一些操作,用到线段树的lazy操作模板类型 */ #include<stdio.h> #include<string.h> #includ ...

  5. HDU 3954 Level up(多颗线段树+lazy操作)

    又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...

  6. 矩形面积并-扫描线 线段树 离散化 模板-poj1151 hdu1542

    今天刚看到这个模板我是懵逼的,这个线段树既没有建树,也没有查询,只有一个update,而且区间成段更新也没有lazy标记....研究了一下午,我突然我发现我以前根本不懂扫描线,之所以没有lazy标记, ...

  7. 线段树--线段树【模板1】P3372

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...

  8. BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)

    潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...

  9. poj3468 线段树+lazy标记

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 92921   ...

随机推荐

  1. (八)利用apache组件进行文件上传下载

    一.文件上传 文件上传,即服务器端得到并处理用户上传的文件,这个文件存放在request里,也就是需要对request进行处理. 1.1 编写html文件 <!DOCTYPE html> ...

  2. Swift学习 (二)

    2.控制流: 主要有三种类型的语句 if,switch和新增的guard for,while break,continue 关于if 语句里的条件不再需要使用()包裹了. 1 2 3 4 let nu ...

  3. pycharm连接linux创建django工程

    windows中安装最新版pycharm--2018年10月的版本 点击创建工程,看下图: C:\Users\Lenovo\PycharmProjects\untitled4 这个路径不要动,一动就出 ...

  4. 使用ASP.NET Core支持GraphQL( restful 配套)

    https://github.com/graphql-dotnet https://github.com/graphql GraphQL简介 官网:https://graphql.cn/code/ 下 ...

  5. 关于async await的测试

    async await的教程:https://www.cnblogs.com/zhaoshujie/p/11192036.html 异步方法: private async Task<string ...

  6. Egret入门学习日记 --- 第十篇(书中 2.9~2.13节 内容)

    第十篇(书中 2.9~2.13节 内容) 好的 2.9节 开始! 总结一下重点: 1.之前通过 ImageLoader 类加载图片的方式,改成了 RES.getResByUrl 的方式. 跟着做: 重 ...

  7. juc多线程编程学习

    JUC是java.util.concurrent的缩写,java.util.concurrent是在并发编程中使用的工具类. 在以前的解决并发问题,一般是通过Synchronize关键字,现在可以通过 ...

  8. 扩展Asp.Net Core中的IdentityUser类

    虽然Asp.Net Core.Identity提供了IdentityUser类,但是在有些情况下我们需要一些额外的用户信息,比如性别,年龄等,这时候就需要来扩展IdentityUser类以达到我们的需 ...

  9. [转帖]CentOS 8.0.1905 和CentOS Stream(滚动发行)正式发布

    CentOS 8.0.1905 和CentOS Stream(滚动发行)正式发布 https://zhuanlan.zhihu.com/p/84001292 还发现openssl 的 版本太高 不兼容 ...

  10. java的简单工厂模式

    目录 代码讲解 UML图解简单工厂 优点 缺点: 改进: 代码讲解 产品功能接口: /** * 定义接口,抽象出产品都具有的功能 */ interface Produce { void method( ...