代码+注释:

 #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. PostgreSQL中JSON、JSONB基本操作符

    PostgreSQL 9.5以上的版本中有了很多方便的操作符,使得操作 JSON 变得非常方便了. 一. -> 和 ->> : -> 表示获取一个JSON数组元素,支持下标值( ...

  2. npx 是什么?

    参考链接:https://www.jianshu.com/p/cee806439865

  3. Python爬虫从入门到进阶(2)之urllib库的使用

    1.什么是Urllib(官网地址:https://docs.python.org/3/library/urllib.html#module-urllib) Urllib是python内置的HTTP请求 ...

  4. 医学图像数据(三)——TCIA部分数据下载方式

    前为止,本人还没有找到不需要账号的就可以部分下载的方式,因此这里讲的是需要注册账号下载部分数据的方法. 注意:下载部分数据需要注册账号 注册账号网址:https://public.cancerimag ...

  5. 后端api规范说明文档

    我们此次后端api的实现主要是按照RESTful api规范来设计的,就是符合REST架构下设计api的规范.简单的来说REST结构就是:利用URL定位资源,用HTTP动词(GET,POST,PUT, ...

  6. 提高github代码下载速度的小技巧

    1.打开如下路径: C:\Windows\System32\drivers\etc 2.将此处的HOSTS文件复制到其他地方,比如桌面.(此处大概率是没有编辑权限的) 3.用记事本打开HOSTS文件, ...

  7. Django models文件模型变更注意事项(表结构的修改)

    表结构的修改 1.表结构修改后,原来表中已存在的数据,就会出现结构混乱,makemigrations更新表的时候就会出错 比如第一次建模型,漏了一个字段,后来补上了.(经常遇到模型字段修改) 重新ma ...

  8. 关于解决微信支付sdk中NoClassDefFoundError: Failed resolution of: org.apache.http.conn.ssl.DefaultHostnameVerifier;

    导入依赖<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>ht ...

  9. Python3学习笔记十五

    ---恢复内容开始--- 1.  jquery的属性操作  $().attr(属性名)    取值 $().attr(属性名,属性值)      赋值 <!DOCTYPE html> &l ...

  10. 部署lamp动态网站(图解)

    环境拓扑如下:1.两台虚拟机要互通   2.修改selinux   +++++++++++++++++++++++++++服务器133上: 1.安装需要的组件httpd,mariadb,php   2 ...