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

#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. HttpRequest Get和Post调用其他页面的方法

    HttpRequest Get和Post调用其他页面的方法,需要的朋友可以参考一下 //Get请求方式     private string RequestGet(string Url)     { ...

  2. 记EXSI虚拟机CentOS7断电无法启动修复过程

    参考:https://msd.misuland.com/pd/3148108429789233656 EXSI6.7安装虚拟机CentOS7.5 1804 断电后启动页面进度条很慢 最后出现如下提示 ...

  3. Nginx作为负载均衡把客户端真实IP发送给后端配置

    Nginx作为负载均衡获取到客户端的真实IP,但是后端获取到的IP为nginx负载均衡的IP,需要修改配置使后端获取到客户端的真实IP 修改nginx配置增加3行 proxy_set_header H ...

  4. Ocelot+Consul 集群搭建实践

    博客园已经有很多大神写过consul集群搭建了.大家都在玩,那我也不能托后退呢 不过自己研究下还是好的.毕竟每个人遇到的问题的不同 研究过才能说自己玩过consul,文章有部分名词解释是收集网络 Co ...

  5. web-自动化测试流程

    1. 自动化测试流程 (1) 需求分析 (2) 挑选适合做自动化测试的功能 (3) 设计测试用例 (4) 搭建自动化测试环境 [可选] (5) 设计自动化测试项目的架构 [可选] (6) 编写代码 ( ...

  6. git 提交大小超过100M

    #MsnDialog.ad, #MyMoveAd, #QQ_Full, #ad-SNSSplashAd, #ad6cn, #adBody07, #adLeftFloat, #adRightFloat, ...

  7. 慕课零基础学java语言翁恺老师——第一周编程题

    温度转换(5分) 题目内容: 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示华氏温度. 程序的输入是一个整数,表示华氏温度.输出 ...

  8. Android核心程序之SystemUI - (一)开篇

    UI是实现用户交互的重要途径之一,而Android中一个重要的UI元素就是SystemUI,本文分析基于Android 5.1,分析SystemUI的启动及运行过程. SystemUI源代码所在路径为 ...

  9. 使用Homebrew来安装Node等工具

    原文转载自:https://www.cnblogs.com/richard-youth/p/9718349.html 使用 React Native,必须安装的依赖有:Node.Watchman 和 ...

  10. python函数声明和调用(18)

    函数是指代码片段,可以重复调用,比如我们前面文章接触到的type()/len()等等都是函数,这些函数是python的内置函数,python底层封装后用于实现某些功能. 一.函数的定义 在Python ...