1082 线段树练习 3

时间限制: 3 s

空间限制: 128000 KB

题目等级 : 大师 Maste

传送门

题目描述 Description

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

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

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

输入描述 Input Description

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

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

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

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

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

输出描述 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<iostream>
#include<cstdio>
#define MAXN 200001
#define ll long long
using namespace std;
ll n,m,tot,cut,aa[MAXN+10];
struct data
{
int l,r;
int lc,rc;
ll sum;
ll bj;
}tree[MAXN*4];
void build(int l,int r)
{
int k=++cut;
tree[k].l=l;
tree[k].r=r;
if(l==r)
{
tree[k].sum=aa[l];
return ;
}
int mid=(l+r)>>1;
tree[k].lc=cut+1;
build(l,mid);
tree[k].rc=cut+1;
build(mid+1,r);
tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;
}
void updata(int k)
{
tree[tree[k].lc].sum+=
tree[k].bj*(tree[tree[k].lc].r-tree[tree[k].lc].l+1);
tree[tree[k].rc].sum+=
tree[k].bj*(tree[tree[k].rc].r-tree[tree[k].rc].l+1);
tree[tree[k].lc].bj+=tree[k].bj;
tree[tree[k].rc].bj+=tree[k].bj;
tree[k].bj=0;
}
void add(int k,int l,int r,int add1)
{
if(l<=tree[k].l&&tree[k].r<=r)
{
tree[k].bj+=add1;
tree[k].sum+=add1*(tree[k].r-tree[k].l+1);
return ;
}
if(tree[k].bj) updata(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(l<=mid) add(tree[k].lc,l,r,add1);
if(r>mid) add(tree[k].rc,l,r,add1);
tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;
}
ll query(int k,int l,int r)
{
if(l<=tree[k].l&&tree[k].r<=r) return tree[k].sum;
ll tot=0;
if(tree[k].bj) updata(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(l<=mid) tot+=query(tree[k].lc,l,r);
if(r>mid) tot+=query(tree[k].rc,l,r);
tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;
return tot;
}
int main()
{
int x,a,b,add1;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>aa[i];
}
build(1,n);
cin>>m;
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
if(x==1)
{
scanf("%d %d %d",&a,&b,&add1);
add(1,a,b,add1);
}
else
{
scanf("%d %d",&a,&b);
printf("%lld\n",query(1,a,b));
}
}
return 0;
}

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  题目等级 : 大师 Master 题解       题目描述 Description 给你N个数,有两种操作: 1: ...

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

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

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

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

  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.5037.线段树练习4加强版(分块 区间k的倍数)

    题目链接 /* 如果用线段树,每个节点要再开k的空间,显然不行.但是分块可以(虽然空间依旧爆炸) 分块.用bloans[i][j]表示 第i块 模k为j 的有多少个 对于不是整块的,查询时应判断 A[ ...

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

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

随机推荐

  1. Nido.Common.Utilities.MD5类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Sec ...

  2. The Same Game": A Simple Game from Start to Finish3

    视图: 画出你的游戏界面 前面,我们的文档对象中已经初始化了游戏板对象,接下来我们需要显示这些信息给用户了. 第一步是添加代码,来重新设置我们的窗口尺寸.缺省的窗口尺寸不是我们想要的,我们将重写OnI ...

  3. vi同类品

    nvi 更纯正,接近原始的vi command argument-F    don't copy whole file, may faster-S    secure help (quick refe ...

  4. MongoDB:The Definitive Guide CHAPTER 2 Getting Started

    MongoDB is very powerful, but it is still easy to get started with. In this chapter we’ll introduce ...

  5. jQuery.validate 中文API

      名称 返回类型 描述 validate(options) 返回:Validator 验证所选的FORM valid() 返回:Boolean 检查是否验证通过 rules() 返回:Options ...

  6. Hibernate学习之get和load区别

    结论: insert():插入记录并将同步更新到session缓存. update():更新记录并同步更新到session缓存. delete():删除记录并同步更新session缓存. get(): ...

  7. 搭建PHP开发环境 apache+MySQL+PHP 安装phpMyAdmin模块

    该博文参考的资料来源于: http://wenku.baidu.com/view/0e4c569ddd3383c4bb4cd267.html http://www.cnblogs.com/pharen ...

  8. linux route命令学习

    route命令用于显示和操作IP路由表. 没有增加路由之前,route命令的结果如下, sh-# route Kernel IP routing table Destination     Gatew ...

  9. UDP 校检和和算法

    #include <Winsock2.h> #include <stdio.h> #define IP_HDRINCL 2 // Header is included with ...

  10. hadoop错误Could not obtain block blk_XXX_YYY from any node:java.io.IOException:No live nodes contain current block

    错误: 10/12/08 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYY ...