洛谷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串,全 ...
随机推荐
- PHP 浮点型运算相关问题
php 浮点数计算比较及取整不准确.举例: $a = 0.2+0.7; $b = 0.9; var_dump($a == $b); //输出的结果为bool(false) PHP 官方手册说明:显然简 ...
- PHP 对象继承
对象继承 继承已为大家所熟知的一个程序设计特性,PHP 的对象模型也使用了继承.继承将会影响到类与类,对象与对象之间的关系. 比如,当扩展一个类,子类就会继承父类所有公有的和受保护的方法.除非子类覆盖 ...
- kotlin单个文件及文件夹复制例子
最近学习kotlin,把java中的单个文件及包含文件夹的文件 复制操作改写为kotlin的代码,主要熟悉kotlin文件操作以及递归调用操作方法 演示代码如下: package com.exam.f ...
- ActionBar 自定义布局定义
ActionBar 自定义布局定义 Android系统中ActionBar默认的布局不美观且难于控制,通过为ActionBar自定义布局的方式可以灵活控制ActionBar. 效果: 工具/原料 ...
- DataSource接口 Connection pooling(连接池
一.DataSource接口是一个更好的连接数据源的方法: JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实 ...
- flutter 数据存储 SP和sqlite
添加插件: shared_preferences: ^0.4.2 path_provider: ^1.2.0 sqflite: ^0.12.0 import 'dart:async'; import ...
- Spring cloud微服务安全实战-5-12实现基于token的SSO(2)
我只要把这个meFilter放在AuthorizationFilter后面就可以了. authorizationFilter的排序是3 MeFilter设置为4 就可以了. 拿到了username直接 ...
- ES6深入浅出-12 ES6新增的API(下)-1.录屏
String.includes es5里面判断字符串是否存在的方法 search searcg的厉害之处是可以使用正则 match正则的方式 repeat -1遍,就不合法 startsWith 判断 ...
- 【插件】thinkphp5+百度编辑器自定义上传
1 官方下载sdk 2 在引入编辑器页面.写入js // 百度编辑器 UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActi ...
- java 时间的原生操作和工具类操作
package com.xc.test.dateoperation; import org.apache.commons.lang3.time.DateFormatUtils; import org. ...