代码+注释:

 #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. python3抓图学习-百度贴吧

    # coding=utf-8 from bs4 import BeautifulSoup import urllib.request import os import time def downlao ...

  2. Linux设置允许指定端口通过防火墙centos7

    开启防火墙 1.systemctl start firewalld.service(开启防火墙) 2.systemctl stop firewalld.service(开启防火墙) 3.service ...

  3. 阿里云服务器ftp连接后21端口无法使用的问题

    今天在阿里云Centos上搭了一个ftp 服务,开启了20和21端口的权限.但是用工具和ftp命令登录,均超时. ftp命令登录成功后不能使用ls 命令,直接超时. 工具登录成功后 获取根目录失败,也 ...

  4. C++自己实现一个String类

    C++自己实现一个String类(构造函数.拷贝构造函数.析构函数和字符串赋值函数) #include <iostream> #include <cstring> using ...

  5. jmeter分布式测试教程和远程的代理机无法连接网络的问题解决方法

    一.Jmeter分布式执行原理: 1.Jmeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent). 2.执行时,Controller会把脚本发送到每台A ...

  6. php nginx 负载均衡简单配置过程

    负载均衡 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦. 简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解 ...

  7. Triplet Loss(转)

    参考:https://blog.csdn.net/u013082989/article/details/83537370 作用:用于对差异较小的类别进行区分

  8. window下安装 node ,并搭建 vue 项目

    uname -a  命令查看到我的Linux系统位数是64位(备注:x86_64表示64位系统, i686 i386表示32位系统) window下安装node 1.在官网上选择对应的位数的msi安装 ...

  9. 使用scrapy爬虫,爬取17k小说网的案例-方法一

    无意间看到17小说网里面有一些小说小故事,于是决定用爬虫爬取下来自己看着玩,下图这个页面就是要爬取的来源. a 这个页面一共有125个标题,每个标题里面对应一个内容,如下图所示 下面直接看最核心spi ...

  10. linux系统自动备份打包部署脚本

    1.使用jenkins配置任务 2.执行脚本放在/home/guard/目录下 #!/bin/sh #author wangxiangyu #当前时间 DATE=$(date +%Y%m%d) #环境 ...