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

#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. java编写的一段简单的网络爬虫demo代码

    功能: 从网站上下载附件,并从页面中提取页面文章内容 关于NIO 在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚.操作系统并非不能快速传送数据,让 Java 有事可做:相反,是 JVM ...

  2. leetcode1277 Count Square Submatrices with All Ones

    思路: 使用动态规划,dp[i][j]表示以(i, j)作为右下角的最大的全1矩阵的边长. 实现: class Solution { public: int countSquares(vector&l ...

  3. 基于Jquery ui 可复用的酒店 web页面选择入住日期插件

    效果图: 代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...

  4. eNSP下利用三层交换机实现VLAN间路由

    我们可以通过配置VLANif接口的方式来使交换机实现路由交换. 而VLANif接口是基于网络层的接口,可以配置ip地址 拓扑图如下

  5. sql server 日期函数

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  6. K8S从入门到放弃系列-(8)kube-apiserver 高可用配置

    摘要: 前面几篇文章,就是整个的master节点各组件的部署,上面我们提到过,k8s组件中,kube-controller-manager.kube-scheduler及etcd这三个服务高可用,都是 ...

  7. python多任务基础

    1.多任务:两个程序段同时运行2.为某个函数创建线程并启动: import threading 线程名 = threading.Thread(target = 函数名,args = 参数元组) #创建 ...

  8. const关键字的使用——C语言

    一.常规用法 关键字const用来定义只读变量,被const定义的变量它的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以.所以说它定义的是只读变量,这也就意味着必须在定义的时候就给它 ...

  9. Spring框架ioc概括

    什么是Spring且能做什么 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能由EJB完成 ...

  10. 其实每个行业都有各自的辛苦,好的程序员并不累,他们乐此不疲(见过太多在职位事业、人生方向上随转如流的人,累了疲乏了就去做别的事情了。必须有自己的坚守和立足的点,自我驱动,否则沦为在别人的体制制度中被驱赶一生)good

    作者:陈柯好链接:https://www.zhihu.com/question/39813913/answer/104275537来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...