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. go语言 类型:字符串

    示例 package main import ( "fmt" ) func main() { var str1 string // 声明一个字符串变量 str1 = "H ...

  2. 强大的<canvas>

    <canvas> 个人认为<canvas>是h5最重量级的新标签了,现在各种h5小游戏都是基于<canvas>的,它为游戏提供了一个功能强大的画布,可在画布上绘制丰 ...

  3. javascript --- Function模式

    回调函数 在javascript中,当一个函数A作为另外一个函数B的其中一个参数时,则称A函数为回调函数,即A可以在函数B的运行周期内执行(开始,中间,结束). 举例来说,有一个函数用于生成node. ...

  4. javascript --- 设计模式之Module模式

    基本用法 先看一下最简单的一个实现,代码如下: var Calculator = function(){ // 这里可以声明私有成员 var eqCtrl = document.getElement( ...

  5. fullPage教程 -- 整屏滚动效果插件 fullpage详解

    1.引用文件 [html] view plain copy print?在CODE上查看代码片派生到我的代码片 <link rel="stylesheet" href=&qu ...

  6. web代理工具WebScarab

  7. iOS 9 使用HTTP的方法

    问题 在ios 9中使用HTTP请求,Xcode就会抛出下面的Exception: App Transport Security has blocked a cleartext HTTP (http: ...

  8. iOS之 HTTP、Socket、TCP的区别(易混

    一.HTTP 是一种超文本传输协议,全名hypertext transfer protocol,从字面意思上可以看出该协议用于规定客户端与服务端之间的传输规则, 传输的内容不限于文本(任意类型的数据) ...

  9. raw_input() 与 input() __ Python

    这两个均是 python 的内建函数,通过读取控制台的输入与用户实现交互.但他们的功能不尽相同.举两个小例子. 1 >>> raw_input_A = raw_input(" ...

  10. 什么是Java实例初始化块

    在本篇文章,我将会使用一个例子展示什么是实例变量初始化块,实例初始化块和静态初始化块,然后说明在Java中实例初始化块是如何工作的. 执行顺序 查看下面的代码,你知道哪个先执行吗? package s ...