洛谷P3372--线段树代码模板1
如题,已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数加上x
2.求出某区间每一个数的和
输入格式
第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。
接下来M行每行包含3或4个整数,表示一个操作,具体如下:
操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k
操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和
输出格式
输出包含若干行整数,即为所有操作2的结果。
输入输出样例
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
11
8
20
说明/提示
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=1000,M<=10000
对于100%的数据:N<=100000,M<=100000
(数据已经过加强^_^,保证在int64/long long数据范围内)
样例说明:

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<list>
#include<queue>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
const int maxn = ;
int arr[maxn +];
struct node
{
/* data */
long long value;//该结点维护的值
int left;
int right;
long long add;//lazy 每个区间的增量
}tree[maxn* + ]; inline void PushUp(int root)
{
tree[root].value = tree[root <<].value + tree[root<<|].value;
} void Build(int root,int x,int y)
{
tree[root].left = x;
tree[root].right = y;
if(x == y)
{
tree[root].value = arr[x];
return ;
}
int mid = (x + y) >> ;
Build(root<<, x,mid);
Build(root<<|,mid+,y);
PushUp(root);
} void Spread(int root)//懒标记
{
if(tree[root].add)//如果树根结点的懒标记不为0 ,修改左右儿子的值
{
tree[root<<].value += tree[root].add * (tree[root<<].right - tree[root<<].left +);
tree[root<<|].value += tree[root].add * (tree[root<<|].right - tree[root<<|].left +);
//左右儿子的值增加为父亲结点的增量乘以自己各区间的长度
tree[root<<].add += tree[root].add;
tree[root<<|].add += tree[root].add;
tree[root].add = ;//父亲结点增量变为0;
}
}
void Change(int root,int x,int y,int z)//给根结点为root 区间为(x,y)的每个值加上z
{
if( x <= tree[root].left && y >= tree[root].right)//区间被完全覆盖
{
tree[root].value += (long long )z * (tree[root].right - tree[root].left + );
tree[root].add += z;
return ;
}
Spread(root);//如果没有发现区间被覆盖,即需要继续向下找,并把懒标记下放
int mid = (tree[root].right + tree[root].left) >> ;
if( x <= mid)//要修还区间覆盖了左儿子,修改
{
Change(root<<,x,y,z);
}
if( y > mid)//右儿子同理
{
Change(root<<|,x,y,z);
}
PushUp(root);
} long long Query(int root,int x,int y)//对区间(x,y)的查询操作
{
long long ans = ;
if( x <= tree[root].left && y >= tree[root].right )//查询区间被根结点所对应区间覆盖
{
return tree[root].value;
}
Spread(root);//下传懒标记
int mid = (tree[root].left + tree[root].right) >> ;
if ( x <= mid)
{
ans += Query(root<<,x,y);
}
if( y > mid)
{
ans += Query(root<<|,x,y);
}
return ans;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = ; i<= n;i++)
{
scanf("%d",&arr[i]);
}
Build(,,n);
for(int i = ;i < m;i++)
{
int flag;
int x,y,k;
cin>>flag;
if(flag == )
{
scanf("%d%d%d",&x,&y,&k);
Change(,x,y,k);
}
else
{
scanf("%d%d",&x,&y);
cout<<Query(,x,y)<<endl;
}
}
return ;
}
洛谷P3372--线段树代码模板1的更多相关文章
- 洛谷P3372线段树模板1——线段树
		题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ... 
- 洛谷P3372线段树1
		难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ... 
- 洛谷   P3372   线段树1
		这是一道模板题 线段树介绍https://www.cnblogs.com/nvwang123/p/10420832.html #include<bits/stdc++.h> using n ... 
- NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
		原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ... 
- 洛谷P3373线段树模板2
		题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ... 
- 洛谷P3373 线段树2(补上注释了)
		毒瘤题.找了一下午+晚上的BUG,才发现原来query_tree写的是a%p; 真的是一个教训 UPD:2019.6.18 #include<iostream> #include<c ... 
- 洛谷3372线段树模板题 对区间+k或者查询区间和
		#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ... 
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
		洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ... 
- 洛谷1087 FBI树 解题报告
		洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ... 
随机推荐
- 【笔试题】某公司中有N名员工。给定所有员工工资的清单
			排列员工工资顺序(C++map解法) 题目描述:某公司中有N名员工.给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资.他按照工资的频次降序排列.即给定清单中所有频次较高的工资将在频次较低 ... 
- python中的raise用法
			date ; 2019-08-22 15:10:56 try: s = None if s is None: print("s shi kong de ") raise NameE ... 
- 为什么vue组件的属性,有的需要加冒号“:”,有的不用?
			https://segmentfault.com/q/1010000010929963/a-1020000010930077 <tab :line-width="2" act ... 
- 123457123456#1#----com.MC.EnglishGame98--前拼后广--jp英语-mc
			com.MC.EnglishGame98--前拼后广--jp英语-mc 
- Ideal设置编码格式
			file-------settings-------file Encodings 
- [转]Ubuntu安装ss客户端
			链接:https://www.cnblogs.com/hoanfir/p/9308148.html 配置好后,使用 chromium-browser --proxy-server=socks5://1 ... 
- Meta标签中的http-equiv属性
			http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变 ... 
- Web书写Test Case时需要考虑的检查点
			通常书写Test Case时需要考虑的检查点: 一. 对于屏幕显示来说包括:1.检查显示的布局:2.检查域和按钮的顺序:3.检查域的尺寸:4.检查字体的大小和风格:5.检查文本的含义:6.检查拼写错误 ... 
- 什么时候该用readfile() , fread(), file_get_contents(), fgets()?
			fread() 和 readfile() fread() 最大一次性能读取 8k长度的字节数,所以不能一次性读取大文件去作下载. 优势在于,操作更加灵活,每次读取指定字节的内容,用于下载时方便控制服务 ... 
- 切实解决socket连接掉线检测
			原文:切实解决socket连接掉线检测 版权声明:欢迎转载,但是请保留出处说明 https://blog.csdn.net/lanwilliam/article/details/51698807 新公 ... 
