【codevs】1082 线段树练习 3 <区间修改+区间和>
题目连接 http://codevs.cn/problem/1082/
Description
给你N个数,有两种操作:
1:给区间[a,b]的所有数增加X
2:询问区间[a,b]的数的和。
第一行一个正整数n,接下来n行n个整数,
再接下来一个正整数Q,每行表示操作的个数,
如果第一个数是1,后接3个正整数,
表示在区间[a,b]内每个数增加X,如果是2,
表示操作2询问区间[a,b]的和是多少。
对于每个询问输出一行一个答案
3
1
2
3
2
1 2 3 2
2 2 3
9
数据范围
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 <区间修改+区间和>的更多相关文章
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- Codevs 1082 线段树练习 3
1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Maste 传送门 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的 ...
- codevs 1082 线段树练习3
1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 给你N个数,有两种操作: 1: ...
- codevs 1082 线段树练习3 (线段树)
题目: 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数 ...
- 【树状数组区间修改区间求和】codevs 1082 线段树练习 3
http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...
- codevs 1082 线段树练习 3 区间更新+延迟标记
题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...
- codevs 1082 线段树练习 3 --分块练习
时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[ ...
- CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)
题目链接 /* 如果用线段树,每个节点要再开k的空间,显然不行.但是分块可以(虽然空间依旧爆炸) 分块.用bloans[i][j]表示 第i块 模k为j 的有多少个 对于不是整块的,查询时应判断 A[ ...
- codevs 1082 线段树练习3 模板题
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ],sum[ ...
随机推荐
- Ubuntu 为网卡配置静态IP地址
为网卡配置静态IP地址编辑文件/etc/network/interfaces:sudo vi /etc/network/interfaces并用下面的行来替换有关eth0的行:# The primar ...
- dedecms升级后报错
DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value to include C,G and P (recomm ...
- (7)基本工作流(使用AndroidStudio编辑Cocos项目)
接下来详细介绍一下如何使用Android Studio打开以及编辑cocos2d-x 3.10项目: 一.新建项目: 新建源代码项目,预编译库项目不支持使用Android Stduio打开,见图1 ...
- Forth scrum meeting - 2015/10/29
今天下午,我们终于要到了MOOC服务器端开发人员的联系方式,于是我们小组派了三名同学去实验室与他们进行了交流,并咨询了他们一些关于API接口的问题.他们也对我们这个客户端的开发提出了一些建议. 开发团 ...
- 淘宝(阿里百川)手机客户端开发日记第六篇 Service详解(四)
DEMO1:在Activity里声明一个回调方法,当service完成任务后,调用这个回调方法. 首先,我们先继承service,来创建服务,代码如下: package com.example.ser ...
- [Effective JavaScript 笔记]第62条:在异步序列中使用嵌套或命名的回调函数
异步程序的操作顺序 61条讲述了异步API如何执行潜在的代价高昂的I/O操作,而不阻塞应用程序继续处理其他输入.理解异步程序的操作顺序刚开始有点混乱.例如,下面的代码会在打印"finishe ...
- django程序报错CSRF verification failed. Request aborted.
django程序的html页面中form的method='post'的时候报错 Forbidden (403) CSRF verification failed. Request aborted.He ...
- [BZOJ1370][Baltic2003]Gang团伙
[BZOJ1370][Baltic2003]Gang团伙 试题描述 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: ...
- Stanford机器学习---第四讲. 神经网络的表示 Neural Networks representation
原文 http://blog.csdn.net/abcjennifer/article/details/7749309 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...
- HDOJ 1875
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...