代码+注释:

 #include <iostream>
#include <cstdio>
using namespace std; int n, q, flag, x, y, v;
int a[];
struct node{
long long a, b;
}tree[]; //树,a为数据域,b为标记 void build_tree(int now, int l, int r) { //建树
if (l == r) {
tree[now].a = a[l]; //填充数据
return ;
}
int mid = (l + r) >> ; //mid = (l + r) div 2; 位运算加速
build_tree(now + now, l, mid); //往左边继续建树
build_tree(now + now + , mid + , r); //往右边继续建树
tree[now].a = tree[now + now].a + tree[now + now + ].a; //此时节点数据域为下接两个节点的和,便于查询
} void plust(int now, int l, int r, int x, int y) {//区间加操作
if ((l == x) && (r == y) || (l == r)) { //达到要求
tree[now].a += v * (r - l + ); //累加v的值与当前节点下所有的节点数的积(若当前节点下没有节点则为1)
tree[now].b += v; //打标记
return ; //回溯
}
int mid = (l + r) >> ;
tree[now + now].b += tree[now].b; //向下传递标记(以下都是)
tree[now + now + ].b += tree[now].b;
tree[now + now].a += (tree[now].b * (mid - l + ));
tree[now + now + ].a += (tree[now].b * (r - mid));
tree[now].b = ; //向下传递标记,当前标记清空(不管怎么样就是这样)
if (y <= mid) plust(now + now, l, mid, x, y);//若操作区间在mid左边,往左边继续操作
else if (x > mid) plust(now + now + , mid + , r, x, y);//若在mid右边,往右边继续操作
else { //否则拆开分别左右操作
plust(now + now, l, mid, x, mid);
plust(now + now + , mid + , r, mid + , y);
}
tree[now].a = tree[now + now].a + tree[now + now + ].a; //更新当前节点的数据
} long long query(int now, int l, int r, int x, int y) { //区间查询
if ((l == x) && (r == y)) return tree[now].a; //若当前节点所代表的区间恰好与需要查询的区间重合,返回值
int mid = (l + r) >> ;
tree[now + now].b += tree[now].b; //同上,向下传递标记(以下都是)
tree[now + now + ].b += tree[now].b;
tree[now + now].a += (tree[now].b * (mid - l + ));
tree[now + now + ].a += (tree[now].b * (r - mid));
tree[now].b = ; //同上,向下传递标记
if (y <= mid) return query(now + now, l, mid, x, y); //查询区间在mid左边,往左边取
else if (x > mid) return query(now + now + , mid + , r, x, y); //否则在右边取
else return query(now + now, l, mid, x, mid) + query(now + now + , mid + , r, mid + , y); //再否则断开从左右边取
} int main() { //主程序
scanf("%d%d", &n, &q); //读入数列的长度和操作的次数
for (int i = ; i <= n; i++)
scanf("%d", &a[i]); build_tree(, , n); //建树 for (int i = ; i <= q; i++) {
scanf("%d%d%d", &flag, &x, &y); //开始
if (flag == ) {
scanf("%d", &v); //v为要加进去的数
plust(, , n, x, y); //区间加操作
continue;
}
printf("%lld\n", query(, , n, x, y)); //否则查询区间
} return ;
}

供个人复习使用

线段树模板1 [Luogu P3372]的更多相关文章

  1. 洛谷P3372线段树模板1——线段树

    题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...

  2. AC日记——【模板】线段树 1 洛谷 P3372

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

  3. 线段树模板(无lazy优化)

    区间修改与区间查询问题 模板: int ans; struct node{ int l,r,v; node(){v=;} }tree[LEN*]; int arr[LEN]; //建树 void bu ...

  4. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  5. hdu1754 I hate it线段树模板 区间最值查询

    题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...

  6. P3373 线段树模板

    好,这是一个线段树模板. #include <cstdio> using namespace std; ; long long int sum[N],tag1[N],tag2[N],mo; ...

  7. 线段树模板hdu 1754:I Hate It

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. UESTC - 1057 秋实大哥与花 线段树模板题

    http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...

  9. POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)

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

随机推荐

  1. sqlyog连接mysql8.0

    1.本人安装的是mysql8.0社区版,安装包名称:mysql-installer-community-8.0.12.0.msi,可自行到官网下载. 2.安装完成后用sqlyog连接数据库出现密码乱码 ...

  2. ASP.NET MVC - Entity Framework

    ASP.NET MVC - Entity Framework 实体关系 关系是某个实体(表)的一条记录对应于另一个实体(表)的一条或多条记录. 一对多关系 单方面的包含关系称为一对多,而一对多和一对一 ...

  3. Visual Studio - File Properties (Build Action, Copy to Output Directory)

    Ref: MSDN (https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/0c6xyb ...

  4. openssl 1.1.1 reference

    openssl 1.1.1 include/openssl aes.h: # define HEADER_AES_H aes.h: # define AES_ENCRYPT 1 aes.h: # de ...

  5. Debug Dump file

    dump file is a snapshot of the processs memeory. to debug it, we need use its corresponding executiv ...

  6. Oracle数据安全解决方案(1)——透明数据加密TDE

    Oracle数据安全解决方案(1)——透明数据加密TDE2009年09月23日 22:49:00 华仔爱技术 阅读数:7991原文地址: http://www.oracle.com/technolog ...

  7. Typescript---01 数据类型

    Typescript数据类型 1. 布尔值boolean let isDone: boolean = false; 注意: 使用构造函数Boolean创造的对象不是布尔值,它是一个对象.所以下边的示例 ...

  8. 2-1、FileBeat入门

    FileBeat入门 要开始使用Filebeat设置,请安装并配置相关产品: 用于存储和索引数据的Elasticsearch. 用户界面的Kibana. 用于解析和增强数据的Logstash(可选). ...

  9. PDF怎么旋转页面,只需几步轻松搞定!

    有时候我们下载一个PDF文件里面有页面是旋转的情况,用手机看的时候可以把手机旋转过来看,那么用电脑的时候总不可能也转过来看吧,笔记本是可以的台式的是不行的,这个时候我们就需要把PDF文件中旋转的页面转 ...

  10. 协议形式化分析Scyther 资料整理

    1.性能分析 目前来说形式化的分析已经成为安全协议的一种很流行的方法,但是每种工具都用其不同适合的协议,Scyther软件是一种形式化分析工具,极大的促进了协议的分析和设计,scyther工具在运行界 ...