热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

1082线段树练习3(线段树区间修改+区间求和)

题目描述Description给你N个数,有两种操作:1:给区间[a,b]的所有数增加X2:询问区间[a,b]的数的和。输入描述I
题目描述  Description

给你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

 
思路:
算是模板提吧,没什么难点,好久没写线段树了,写下熟悉下线段树区间操作,之前还有点不懂,后面自己独立写出来了感觉对这个的理解还是上升了。
 
实现代码:
#include
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int M = 2e5 + 10;
ll lazy[M
<<2],sum[M<<2];
void pushup(int rt){
sum[rt]
= sum[rt<<1] + sum[rt<<1|1];
}

void pushdown(int rt,int m){
if(lazy[rt]){
lazy[rt
<<1] += lazy[rt];
lazy[rt
<<1|1] += lazy[rt];
sum[rt
<<1] += lazy[rt]*(m-(m>>1));
sum[rt
<<1|1] += lazy[rt]*(m>>1);
lazy[rt]
= 0;
}
}

void build(int l,int r,int rt){
lazy[rt]
= 0;
if(l == r){
cin
>>sum[rt];
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
pushup(rt);
}

void update(int L,int R,int c,int l,int r,int rt){
if(L <= l&&R >= r){
lazy[rt]
+= c;
sum[rt]
+= (r - l + 1)*c;
return ;
}
pushdown(rt,r
- l + 1);
int m = (l + r) >> 1;
if(L <= m) update(L,R,c,lson);
if(R > m) update(L,R,c,rson);
pushup(rt);
}

ll query(
int L,int R,int l,int r,int rt){
if(L <= l&&R >= r){
return sum[rt];
}
pushdown(rt,r
- l + 1);
int m = (l + r) >> 1;
ll ret
= 0;
if(L <= m) ret += query(L,R,lson);
if(R > m) ret += query(L,R,rson);
return ret;
}

int main()
{
int n,q,x,l,r,c;
cin
>>n;
build(
1,n,1);
cin
>>q;
while(q--){
cin
>>x;
if(x == 1){
cin
>>l>>r>>c;
update(l,r,c,
1,n,1);
}
else{
cin
>>l>>r;
cout
<1,n,1)<<endl;
}
}
return 0;
}

 


推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • 文件描述符、文件句柄与打开文件之间的关联解析
    本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
author-avatar
中科蓝天李跃华
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有