线段树的区间更新---A Simple Problem with Integers
Description
给出了一个序列,你需要处理如下两种询问。
"C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。
"Q a b" 询问[a, b]区间中所有值的和。
Input
第一行包含两个整数N, Q。1 ≤ N,Q ≤ 100000.
第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤ 1000000000)。
接下来Q行询问,格式如题目描述。
Output
对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。
Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15 思路:线段树区间更新。 本题代码是很好的线段树区间更新模板:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define LL long long
using namespace std;
const int maxn=;
struct Node
{
LL sum,val;
} node[*maxn]; void pushup(int i)
{
node[i].sum=node[i<<].sum+node[i<<|].sum;
} void pushdown(int i,int m)
{
if(node[i].val)
{
node[i<<].val+=node[i].val;
node[i<<|].val+=node[i].val;
node[i<<].sum+=(LL)node[i].val*(m-(m>>));
node[i<<|].sum+=(LL)node[i].val*(m>>);
node[i].val=;
}
} void build(int l,int r,int i)
{
node[i].val=;
if(l==r)
{
scanf("%I64d",&node[i].sum);
return ;
}
int mid=(l+r)/;
build(l,mid,i<<);
build(mid+,r,i<<|);
pushup(i);
} LL query(int L,int R,int l,int r,int i)
{
if(L<=l&&r<=R)
{
return node[i].sum;
}
int mid=(l+r)>>;
pushdown(i,r-l+);
LL ans=;
if(L<=mid)ans+=query(L,R,l,mid,i<<);
if(mid<R)ans+=query(L,R,mid+,r,i<<|);
pushup(i);
return ans;
} void update(int L,int R,int add,int l,int r,int i)
{
if(L<=l&&r<=R)
{
node[i].sum+=(LL)add*(r-l+);
node[i].val+=add;
return ;
}
pushdown(i,r-l+);
int mid=(l+r)>>;
if(L<=mid)update(L,R,add,l,mid,i<<);
if(mid<R)update(L,R,add,mid+,r,i<<|);
pushup(i);
} int main()
{
int n,q,a,b;
LL c;
while(scanf("%d%d",&n,&q)!=EOF)
{
build(,n,);
char s[];
while(q--)
{
scanf("%s",s);
if(s[]=='C')
{
scanf("%d%d%I64d",&a,&b,&c);
update(a,b,c,,n,);
}
else if(s[]=='Q')
{
scanf("%d%d",&a,&b);
printf("%I64d\n",query(a,b,,n,));
}
}
}
return ;
}
线段树的区间更新---A Simple Problem with Integers的更多相关文章
- 【分块】【线段树】bzoj3212 Pku3468 A Simple Problem with Integers
线段树入门题…… 因为poj原来的代码莫名RE,所以丧病地写了区间修改的分块…… 其实就是块上打标记,没有上传下传之类. #include<cstdio> #include<cmat ...
- zoj3686(线段树的区间更新)
对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1698:Just a Hook(线段树,区间更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu1698线段树的区间更新区间查询
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- UVA 12436-Rip Van Winkle's Code(线段树的区间更新)
题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = da ...
- HDU 1556 Color the ball(线段树:区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...
- Color the ball (线段树的区间更新问题)
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...
- ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
Color the Ball Time Limit: 2 Seconds Memory Limit: 65536 KB There are infinite balls in a line ...
随机推荐
- Swift 3 新特性
原文:What's New in Swift 3? ,作者:Ben Morrow,译者:kmyhy Swift 3将于今年下半年推出,为Swift开发者们带来了很多核心代码的改变.如果你没有关注过 S ...
- 读取并创建excel文件(.xls)
第三方库,附件 缺点:该库只支持.xls文件的操作 1.读取excel文件 例子: try { /** * 后续考虑问题,比如Excel里面的图片以及其他数据类型的读取 **/ InputStream ...
- (笔记)Linux内核学习(四)之系统调用
一 用户空间和内核空间 Linux内核将这4G字节虚拟地址空间的空间分为两部分: l 将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”. l ...
- aspose.cell 设置excel里面的文字是超链接
目的: 1.通过方法designer.Workbook.Worksheets[0].Hyperlinks.Add("A1", 1, 1, url);给导出到excel里面的数据加上 ...
- ArcGIS Runtime for Android 使用异步GP服务绘制等值线
关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...
- haproxy 配置
1.环境: 操作系统:CentOS 6.4 haproxy: 1.3.15.10 [下载:http://download.chinaunix.net/download.php?id=25784& ...
- win7下IE主页无法修改,IE设置无法保存解决方案
转自:http://www.myhack58.com/Article/48/65/2012/34411.htm 经测,有效! 现象如下: 1.开启后,首先总是指向http://go.microsoft ...
- JavaScript进阶内容1:各种对象类型判断
该文章主要用来介绍JavaScript中常用的一些对象检测判断方法,整理资源来自书本和网络,如有错误或说明不详之处,望评论提出,本菜定提名感谢……(本文章知识比较基础,大牛请提些意见再绕道,三克油^_ ...
- VS2012下安装NuGet
关于NuGet的两篇文章:MSDN上的使用 NuGet 管理项目库,和博客园dudu的程序员,用NuGet管理好你的包包. VS2012下安装NuGet 在工具菜单下选择“扩展和更新”. 选择“联机” ...
- JS算法总结
1.选择排序: var arr = [3,6,7,2,6,4,1,6,8,24,12,53]; function sort(arr){ // 当数组的长度小于1的时候结束递归 if(arr.lengt ...