题目连接   http://codevs.cn/problem/1082/

Description

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

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

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

Input

第一行一个正整数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 ouput

9

数据范围及提示 Data Size & Hint

数据范围

1<=n<=200000

1<=q<=200000

代码

#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <typeinfo>
#include <map>
#include <stack>
typedef long long ll;
#define inf 0x7fffffff
using namespace std;
inline ll read()
{
ll x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
//**************************************************************************************
struct ss
{
int l,r;
ll sum;
int tag;
}tr[*];
int n;
int a[];
void build(int k,int l,int r)
{
tr[k].l=l;
tr[k].r=r;
if(l==r) {tr[k].sum=a[l];return;}
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
tr[k].sum=tr[k<<].sum+tr[k<<|].sum;
}
void pushdown(int k)
{
int x=tr[k].r-tr[k].l+;
tr[k<<].tag+=tr[k].tag;
tr[k<<|].tag+=tr[k].tag;
tr[k<<].sum+=(x-(x>>))*tr[k].tag;
tr[k<<|].sum+=(x>>)*tr[k].tag;
tr[k].tag=;
}
void update(int k,int a,int b,int x)
{
if(a==tr[k].l&&b==tr[k].r)
{
tr[k].tag+=x;
tr[k].sum+=(b-a+)*x;
return ;
}
if(tr[k].tag)pushdown(k);
int mid=(tr[k].l+tr[k].r)>>;
if(b<=mid)update(k<<,a,b,x);
else if(a>mid)update(k<<|,a,b,x);
else {
update(k<<,a,mid,x);
update(k<<|,mid+,b,x);
}
tr[k].sum=tr[k<<].sum+tr[k<<|].sum;
}
ll ask(int k,int a,int b)
{
if(a==tr[k].l&&b==tr[k].r){return tr[k].sum;}
if(tr[k].tag) pushdown(k);
int mid=(tr[k].l+tr[k].r)>>;
if(b<=mid)return ask(k<<,a,b);
else if(a>mid) return ask(k<<|,a,b);
else {
return (ask(k<<,a,mid)+ask(k<<|,mid+,b));
}
}
int main()
{ scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(,,n);
int q;
scanf("%d",&q);
for(int i=;i<=q;i++)
{
int x,aa,b,mm;
scanf("%d",&mm);
if(mm==)
{
scanf("%d%d%d",&aa,&b,&x);
update(,aa,b,x);
}
else
{
scanf("%d%d",&aa,&b);
printf("%lld\n",ask(,aa,b));
}
}
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

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

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

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

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

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

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

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

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

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

  9. CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)

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

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

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

随机推荐

  1. linux 的终端字体色和背景色的修改方法(二)

     Linux终端下的颜色设置 2013-08-31 22:57:15 分类: LINUX   在 ANSI 兼容终端(例如 xterm.rxvt.konsole 等)里, 可以用彩色显示文本而不仅仅是 ...

  2. c/c++指针

    指针主要分: 指向单一的某个对象/变量, 用于多态或函数指针, 这个不难 - 一级指针 其次是指向数组, 用来操作/遍历数组元素 - 一级/二级指针 指向数组的一级指针很简单了: p指向的是数组的元素 ...

  3. cocos基础教程(9)声音和音效

    使用音效引擎 我们可以使用Cocos2d-x自带的CocosDension库来使用声音引擎.CocosDesion实现了简单易用的SimpleAudioEngine类,为了使用它,我们只需引入他的头文 ...

  4. 复制”链接文件“到虚拟机(VirtualBox)的”共享文件夹“时报错:创建符号链接时报错:只读文件系统

    问题描述: 1.Ubuntu 中的 /www/目录,是宿主主机 Windows 7 以“共享文件夹”的形式挂载的: 2./etc/php.ini 是 /opt/software/php/etc/php ...

  5. URL编码表,URL编码大全

    url编码是一种浏览器用来打包表单输入的格式. 定义 url编码是一种浏览器用来打包表单输入的格式.浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送 ...

  6. IP欺骗使用

    一.为什么要设置IP欺骗 1. 当某个IP的访问过于频繁,或者访问量过大时,服务器会拒绝访问请求,这时候通过IP欺骗可以增加访问频率和访问量,以达到压力测试的效果. 2. 某些服务器配置了负载均衡,使 ...

  7. Linux 4.6分支已到生命尽头 请尽快升级至Linux 4.7.1

    导读 在Linux Kernel 4.7首个维护版本发布的同时,Greg Kroah-Hartman同时也向社区发布了Linux Kernel 4.6.7版本.作为Linux 4.6分支的第7个维护版 ...

  8. ssh连接慢的问题的解决?

    <1>群中同学遇到的问题,我之前在uuwatch也遇到了同样的问题? 问个问题师兄们 突然之间 公司服务器连接很慢 连一个shell需要10几秒钟 服务器就在公司全是内网服务器, 我也不知 ...

  9. 【SpringMVC】SpringMVC系列7之POJO 对象绑定请求参数值

      7.POJO 对象绑定请求参数值 7.1.概述 Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值.而且支持级联属性.如:dept.deptId.dept ...

  10. JavaScript常用事件

    一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4   Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 on ...