洛谷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串,全 ...
随机推荐
- shell编程系列20--文本处理三剑客之awk常用选项
shell编程系列20--文本处理三剑客之awk常用选项 awk选项总结 选项 解释 -v 参数传递 -f 指定脚本文件 -F 指定分隔符 -V 查看awk的版本号 [root@localhost s ...
- Locust性能测试-分布式执行的方法(亲测ok)
来源:https://www.cnblogs.com/yoyoketang/p/11681370.html 前言 使用Locust进行性能测试时,当一台单机不足以模拟所需的用户数量的时候,可以在多台机 ...
- c# vs2010 连接access数据库(转)
第一次在博客园写博文,由于文采不怎么好,即使是自己很熟悉的东西,写起来也会感觉到不知从何讲起,我想写的多了就好了. 这篇文章主要是介绍怎么用c# 语言 vs2010连接access数据库的,连接字符串 ...
- lnmp 多版本php 同时运行
首先需要装好两个版本以上的PHP(例如:php5.6和php7两个版本).这里假设你已安装完成. .配置并启动php默认版本: (设置 nginx 的 vhost 域名配置文件监听端口就好) ).打开 ...
- k8s中删除pod后仍然存在问题
分析: 是因为删除了pod,但是没有删除对应的deployment,删除对应的deployment即可 实例如下: 删除pod [root@test2 ~]# kubectl get pod -n j ...
- 【Leetcode_easy】941. Valid Mountain Array
problem 941. Valid Mountain Array solution: class Solution { public: bool validMountainArray(vector& ...
- pickle.load EOFError: Ran out of input
错误原因:pickle.loads()的次数超过了pickle.dumps()的次数 https://www.cnblogs.com/cmnz/p/6986667.html
- logstash kafka output 日志处理
今天在用logstash解析日志并传送给kafka的时候,发现kafka能收到数据但数据内容已经丢失,具体如下: 在logstash output中增加输出样式之后,问题解决kafka再次接受到的内容 ...
- 【GStreamer开发】GStreamer基础教程01——Hello World
目标 对于一个软件库来说,没有比在屏幕上打印出Hello World更近直观的第一印象了.因为我们是在和一个多媒体的framework打交道,所以我们准备播放一段视频来代替Hello World.不要 ...
- C++ STL-bitset
1.bitset的声明 #include <bitset> using std::bitset; 2.bitset对象的定义和初始化 可以如下声明一个该类型变量: bitset ...