给你N个数,有两种操作:

1:给区间[a,b]的所有数增加X

2:询问区间[a,b]的数的和。

输入描述 Input Description

第一行一个正整数n,接下来n行n个整数,

再接下来一个正整数Q,每行表示操作的个数,

如果第一个数是1,后接3个正整数,

表示在区间[a,b]内每个数增加X,如果是2,

表示操作2询问区间[a,b]的和是多少。

pascal选手请不要使用readln读入

输出描述 Output Description

对于每个询问输出一行一个答案

样例输入 Sample Input

3

1

2

3

2

1 2 3 2

2 2 3

样例输出 Sample Output

9

数据范围及提示 Data Size & Hint

数据范围

1<=n<=200000

1<=q<=200000

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

题目描述

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

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数据范围内)

样例说明:

代码实现:

线段树练习 3:

 #include<cstdio>
#include<iostream>
#define LL long long
using namespace std;
LL n,m,a,b,c,d;
struct nate{LL l,r,s,flag;}t[];
void heritage(LL k){//标记传递。当使用某一区间时,把它的标记下传,并更改左右儿子的需求值。
LL lson=k*,rson=k*+;
t[lson].flag+=t[k].flag;
t[lson].s+=(t[lson].r-t[lson].l+)*t[k].flag;
t[rson].flag+=t[k].flag;
t[rson].s+=(t[rson].r-t[rson].l+)*t[k].flag;
t[k].flag=;
}
void make_tree(LL k,LL l,LL r){
LL lson=k*,rson=k*+;
t[k].l=l;t[k].r=r;
if(l==r){
scanf("%lld",&t[k].s);
return;
}
LL mid=(l+r)/;
make_tree(lson,l,mid);
make_tree(rson,mid+,r);
t[k].s=t[lson].s+t[rson].s;
}
void interval_change(LL k,LL l,LL r,LL v){
LL lson=k*,rson=k*+;
if(t[k].l==l&&t[k].r==r){
t[k].flag+=v;
t[k].s+=(t[k].r-t[k].l+)*v;
return;
}
if(t[k].flag) heritage(k);
LL mid=(t[k].l+t[k].r)/;
if(l<=mid) interval_change(lson,l,min(r,mid),v);
if(r>mid) interval_change(rson,max(l,mid+),r,v);
t[k].s=t[lson].s+t[rson].s;
}
LL interval_query(LL k,LL l,LL r){
LL lson=k*,rson=k*+;
if(t[k].l==l&&t[k].r==r) return t[k].s;
if(t[k].flag) heritage(k);
long long mid=(t[k].l+t[k].r)/,ans=;
if(l<=mid) ans+=interval_query(lson,l,min(r,mid));
if(r>mid) ans+=interval_query(rson,max(l,mid+),r);
return ans;
}
int main(){
scanf("%lld",&n);
make_tree(,,n);
scanf("%lld",&m);
for(int i=;i<=m;i++){
scanf("%lld",&a);
if(a==){
scanf("%lld%lld%lld",&b,&c,&d);
interval_change(,b,c,d);
}
if(a==){
scanf("%lld%lld",&b,&c);
printf("%lld\n",interval_query(,b,c));
}
}
return ;
}

【模板】线段树 1:

 #include<cstdio>
#include<iostream>
using namespace std;
long long n,m,a,b,c,d;
struct nate{long long l,r,s,flag;}t[];
void heritage(long long k){
long long lson=k*,rson=k*+;
t[lson].flag+=t[k].flag;
t[lson].s+=(t[lson].r-t[lson].l+)*t[k].flag;
t[rson].flag+=t[k].flag;
t[rson].s+=(t[rson].r-t[rson].l+)*t[k].flag;
t[k].flag=;
}
void make_tree(long long k,long long l,long long r){
long long lson=k*,rson=k*+;
t[k].l=l;t[k].r=r;
if(l==r){
scanf("%lld",&t[k].s);
return;
}
long long mid=(l+r)/;
make_tree(lson,l,mid);
make_tree(rson,mid+,r);
t[k].s=t[lson].s+t[rson].s;
}
void interval_change(long long k,long long l,long long r,long long v){
long long lson=k*,rson=k*+;
if(t[k].l==l&&t[k].r==r){
t[k].flag+=v;
t[k].s+=(t[k].r-t[k].l+)*v;
return;
}
if(t[k].flag) heritage(k);
long long mid=(t[k].l+t[k].r)/;
if(l<=mid) interval_change(lson,l,min(r,mid),v);
if(r>mid) interval_change(rson,max(l,mid+),r,v);
t[k].s=t[lson].s+t[rson].s;
}
long long interval_query(long long k,long long l,long long r){
int lson=k*,rson=k*+;
if(t[k].l==l&&t[k].r==r) return t[k].s;
if(t[k].flag) heritage(k);
long long mid=(t[k].l+t[k].r)/,ans=;
if(l<=mid) ans+=interval_query(lson,l,min(r,mid));
if(r>mid) ans+=interval_query(rson,max(l,mid+),r);
return ans;
}
int main(){
scanf("%lld%lld",&n,&m);
make_tree(,,n);
for(int i=;i<=m;i++){
scanf("%lld",&a);
if(a==){
scanf("%lld%lld%lld",&b,&c,&d);
interval_change(,b,c,d);
}
if(a==){
scanf("%lld%lld",&b,&c);
printf("%lld\n",interval_query(,b,c));
}
}
return ;
}

其实两个题几乎一样,也是因为这个“几乎”,我洛谷上得了遍零分。

题目来源:CODE[VS],洛谷

线段树练习 3&&P3372 【模板】线段树 1的更多相关文章

  1. 【线段树】【P3372】模板-线段树

    百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...

  2. hdu 1754 I Hate It (模板线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others)    M ...

  3. HDU 3966 Aragorn's Story(模板题)【树链剖分】+【线段树】

    <题目链接> 题目大意: 给定一颗带点权的树,进行两种操作,一是给定树上一段路径,对其上每个点的点权增加或者减少一个数,二是对某个编号点的点权进行查询. 解题分析: 树链剖分的模板题,还不 ...

  4. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  5. 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  6. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

  7. 【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)

    [题意] 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦.所以她出去晃了一晃,做起了一些没什么意 ...

  8. POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

    Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Descrip ...

  9. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

  10. 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树

    原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...

随机推荐

  1. Zend server最大化应用程序的性能、扩展性和可用性

    如果我有8个小时去砍到一棵树,我会花6个小时磨斧子”——林肯(美国总统) 你可以知道? 世界页面访问量的峰值超过7000万每分钟. CloudFare公司服务器问题,导致785000站点崩溃一小时. ...

  2. 读书笔记—CLR via C#线程25-26章节

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  3. IS_EER分析

    下面我们就来具体分析一下这段代码,看看内核中的巧妙设计思路. 要想明白IS_ERR(),首先理解要内核空间.所有的驱动程序都是运行在内核空间,内核空间虽然很大,但总是有限的,而在这有限的空间中,其最后 ...

  4. DSP TMS320C6000基础学习(7)—— Bootloader与VectorTable

    本文主要简单记录C6000在启动装载过程和中断向量表的配置. 1. Bootloader 如上图, (1)在Device Reset阶段: 设备初始化为默认状态,大部分三态输出都配置为高阻态. (2) ...

  5. Coded UI Test对Webpage进行自动化测试

    如何使用Coded UI Test对Webpage进行自动化测试   在Visual Studio中,Coded UI Test已经不是什么新特性了,较早版本的Visual Studio中就已经有这个 ...

  6. java 命令笔记

    http://www.hollischuang.com/archives/105 JPS jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号. jps相当于Solari ...

  7. [转]Libev教程

    libev Table of Contents 1 libev 1.1 About The Code 1.2 EventLoop 1.3 Watcher 1.4 How it works 1.4.1 ...

  8. MVC一些需要注意的问题

    不使用MVC,不知道MVC的好处,但是也会有一些坑,需要注意一下: 比如控件中添加HTML5自定义属性,以为是这样: @Html.TextBox("date",Model.Date ...

  9. NetCat,在网络工具中有“瑞士军刀”美誉

    nc命令详解   NetCat,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本.因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小).功能实用,被设计为一个简单.可 ...

  10. Javascript:看 Javascript 规范,学 this 引用,你会懂的。

    目录 背景this待分析程序先看一个语言规范方法调用备注 背景返回目录 Javascript 的 this 是我的心病,多数情况下知道其运行结果,个别变态的场景下,就给不出解释了,昨天一次偶然的机遇让 ...