1082 线段树练习 3

 时间限制: 3 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 
 
 
题目描述 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

mlgb ;

a了一个星期终于过了;

运行结果

测试点#ask1.in 结果:AC 内存使用量: 232kB 时间使用量: 1ms 
测试点#ask10.in 结果:AC 内存使用量: 13420kB 时间使用量: 399ms 
测试点#ask2.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms 
测试点#ask3.in 结果:AC 内存使用量: 6380kB 时间使用量: 32ms 
测试点#ask4.in 结果:AC 内存使用量: 6892kB 时间使用量: 176ms 
测试点#ask5.in 结果:AC 内存使用量: 6764kB 时间使用量: 177ms 
测试点#ask6.in 结果:AC 内存使用量: 13548kB 时间使用量: 365ms 
测试点#ask7.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms 
测试点#ask8.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms 
测试点#ask9.in 结果:AC 内存使用量: 6252kB 时间使用量: 27ms

代码

#include<cstdio>
using namespace std; struct node {
int l,r;
long long int dis,flag;
};
struct node tree[];
int n,m,q;
int a,b,x1; void tree_up(int k)
{
tree[k].dis=tree[k*].dis+tree[k*+].dis;
} void tree_build(int k,int l,int r)
{
tree[k].l=l;
tree[k].r=r;
if(l==r)
{
scanf("%lld",&tree[k].dis);
return;
}
int mid=(l+r)/;
tree_build(k*,l,mid);
tree_build(k*+,mid+,r);
tree_up(k);
} void tree_down(int k)
{
if(tree[k].l==tree[k].r)
{
tree[k].flag=;
return;
}
tree[k*].flag+=tree[k].flag;
tree[k*].dis+=(tree[k*].r-tree[k*].l+)*tree[k].flag;
tree[k*+].flag+=tree[k].flag;
tree[k*+].dis+=(tree[k*+].r-tree[k*+].l+)*tree[k].flag;
tree[k].flag=;
} void tree_add(int k,int l,int r,int x)
{
if(tree[k].l==l&&tree[k].r==r)
{
tree[k].flag+=x;
tree[k].dis+=(tree[k].r-tree[k].l+)*x;
tree_down(k);
return ;
}
tree_down(k);
int mid=(tree[k].l+tree[k].r)/;
if(l>mid) tree_add(k*+,l,r,x);
else if(r<=mid) tree_add(k*,l,r,x);
else {
tree_add(k*,l,mid,x);
tree_add(k*+,mid+,r,x);
}
tree_up(k);
} long long int tree_query(int k,int l,int r)
{
tree_down(k);
if(tree[k].l!=tree[k].r) tree_up(k);
if(tree[k].l==l&&tree[k].r==r)
return tree[k].dis;
int mid=(tree[k].l+tree[k].r)/;
if(l>mid) return tree_query(k*+,l,r);
else if(r<=mid) return tree_query(k*,l,r);
else return tree_query(k*,l,mid)+tree_query(k*+,mid+,r);
} int main()
{
scanf("%d",&n);
tree_build(,,n);
scanf("%d",&m);
while(m--)
{
scanf("%d",&q);
switch(q){
case :{
scanf("%d%d%d",&a,&b,&x1);
tree_add(,a,b,x1);
break;
}
case :{
scanf("%d%d",&a,&b);
printf("%lld\n",tree_query(,a,b));
break;
}
}
}
return ;
}

codevs 1082 线段树练习3的更多相关文章

  1. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  2. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  3. Codevs 1082 线段树练习 3

    1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Maste 传送门 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的 ...

  4. 【树状数组区间修改区间求和】codevs 1082 线段树练习 3

    http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...

  5. codevs 1082 线段树练习3 (线段树)

    题目: 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数 ...

  6. codevs 1082 线段树练习 3 区间更新+延迟标记

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  7. codevs 1082 线段树练习 3 --分块练习

    时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[ ...

  8. codevs 1082 线段树练习3 模板题

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ],sum[ ...

  9. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

随机推荐

  1. 也来谈谈wap端瀑布流布局

    Definition 瀑布流布局,在视觉上表现为参差不齐的多栏布局,随着页面滚动条向下滚动,新数据不断被加载进来. 瀑布流对于图片的展现,是高效而具有吸引力的,用户一眼扫过的快速阅读模式可以在短时间内 ...

  2. SharePoint 2010 常用技巧及方法总结

    1.代码调试确定进程cd c:\windows\system32\inetsrvappcmd list wppause注:保存成批处理文件,查看进程.bat,用的时候双击即可 2.类似列表新建打开方式 ...

  3. VMware Data Recovery备份恢复vmware虚拟机

    VMware Data Recovery 是VMware虚拟机备份工具,可创建虚拟机备份,同时不会中断虚拟机的使用或虚拟机提供的数据和服务.Data Recovery 管理现有备份,并在这些备份过时后 ...

  4. MojoDatabase 源码学习之对象映射

    Mojo-database是我个人比较喜欢多开源项目,下文是该项目打介绍和地址: mojo-database 简介: MojoDatabase is an ActiveRecord-like ORM ...

  5. 在Window 下安装Redis数据库

    小Alan国庆后就要回深圳找工作了,最近在复习工作所需的相关的技术,今天刚好复习到redis,redis是一个非关系型(NoSql)数据库,采用key-value的方式存储数据,她可以保存字符串(St ...

  6. android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论

    GUI 是任何系统都很重要的一块. android GUI大体分为4大块. 1)SurfaceFlinger 2)WMS 3)View机制 4)InputMethod 这块内容非常之多,但是理解后,可 ...

  7. 转换Excel表格到MarkDown:exceltk

    源码和下载: 源码:https://github.com/fanfeilong/exceltk 下载:http://files.cnblogs.com/files/math/exceltk0.0.9. ...

  8. ASP.NET中常用的几个李天平开源公共类LTP.Common,Maticsoft.DBUtility,LtpPageControl

    ASP.NET中常用的几个开源公共类: LTP.Common.dll: 通用函数类库     源码下载Maticsoft.DBUtility.dll 数据访问类库组件     源码下载LtpPageC ...

  9. Spring CharacterEncodingFilter

    <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> <filter> <filter-name>springUtf8Encoding</fi ...

  10. C# 读取在存储过程多结果集

    --SQL Server 测试环境搭建: Create database Test; go USE [Test] GO if OBJECT_ID('Tab','U') is not null drop ...