如题,已知一个数列,你需要进行下面两种操作:

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的结果。

输入输出样例

输入 #1复制

5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
输出 #1复制

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的更多相关文章

  1. 洛谷P3372线段树模板1——线段树

    题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...

  2. 洛谷P3372线段树1

    难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...

  3. 洛谷 P3372 线段树1

    这是一道模板题 线段树介绍https://www.cnblogs.com/nvwang123/p/10420832.html #include<bits/stdc++.h> using n ...

  4. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

  5. 洛谷P3373线段树模板2

    题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...

  6. 洛谷P3373 线段树2(补上注释了)

    毒瘤题.找了一下午+晚上的BUG,才发现原来query_tree写的是a%p; 真的是一个教训 UPD:2019.6.18 #include<iostream> #include<c ...

  7. 洛谷3372线段树模板题 对区间+k或者查询区间和

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  8. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

  9. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

随机推荐

  1. [原][OE][官方例子]osgearth_features OE地球添加shp文件(特征标识)

    OE所有官方样例 官方示例代码 /* -*-c++-*- */ /* osgEarth - Dynamic map generation toolkit for OpenSceneGraph * Co ...

  2. scipy详解

    登月图片消噪   scipy.fftpack模块用来计算快速傅里叶变换速度比传统傅里叶变换更快,是对之前算法的改进图片是二维数据,注意使用fftpack的二维转变方法   import numpy a ...

  3. Flutter Form正确使用方法【可正确获取提交的表单数据】

    import 'package:flutter/material.dart'; void main() => runApp(new HomePage()); class HomePage ext ...

  4. Python利用ctypes实现按引用传参

    C的代码 void test_cref(char *a, int *b, char *data) { , sizeof(char)); strcpy(p, "cute"); a[] ...

  5. DateUtil 提供一些常用的时间想法的方法

    package com.opslab.util; import java.text.ParseException;import java.text.SimpleDateFormat;import ja ...

  6. android多图选择器 图片/视频 单选or多选,以及视频录制。

    PictureSelector 最近项目中用到多图选择上传的需求,考虑到android机型众多问题就自己花时间写了一个,测试了大概60款机型,出现过一些问题也都一一修复了,基本上稳定了特分享出来,界面 ...

  7. Python 环境搭建(Win 安装以及Mac OS 安装)

    千里之行始于足下,今天我们先来学习 Python 环境搭建. 注意:本系列教程基于 Python 3.X Python 环境搭建 Win 安装 打开 Python 官网 https://www.pyt ...

  8. Stream知识点总结及源码阅读

    上次[http://www.cnblogs.com/webor2006/p/7795596.html]对Stream进行了简单的学习,这次继续学习Stream,还是结合java8 in action这 ...

  9. [bzoj3829][Poi2014]FarmCraft_树形dp

    FarmCraft 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=3829 数据范围:略. 题解: 因为每条边只能必须走两次,所以我们的路径一定是 ...

  10. models环境配置和表查询

    一般操作 在进行一般操作时先配置一下参数,使得我们可以直接在Django页面中运行我们的测试脚本 在Python脚本中调用Django环境 模型转为mysql数据库中的表settings配置 需要在s ...