Codevs1082 线段树练习 3
给你N个数,有两种操作:
1:给区间[a,b]的所有数增加X
2:询问区间[a,b]的数的和。
第一行一个正整数n,接下来n行n个整数,
再接下来一个正整数Q,每行表示操作的个数,
如果第一个数是1,后接3个正整数,
表示在区间[a,b]内每个数增加X,如果是2,
表示操作2询问区间[a,b]的和是多少。
pascal选手请不要使用readln读入
对于每个询问输出一行一个答案
3
1
2
3
2
1 2 3 2
2 2 3
9
数据范围
1<=n<=200000
1<=q<=200000
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; int n,m;
int f[]; int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-f;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} int lowbit(int x)
{
return x&(-x);
} void update(int x,int num)
{
while(x<=n)
{
f[x]+=num;
x+=lowbit(x);
}
} int sum(int x)
{
int sum=;
while(x>)
{
sum+=f[x];
x-=lowbit(x);
}
return sum;
} int main()
{
n=read();
for(int i=;i<=n;i++)
update(i,read());
m=read();
for(int i=;i<=m;i++)
{
int t=read(),x,y,z;
if(t==)
{
x=read();y=read();z=read();
for(int j=x;j<=y;j++)
update(j,z);
}
if(t==)
{
x=read();y=read();
printf("%d\n",sum(y)-sum(x-));
}
}
return ;
}
线段树:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; struct node
{
int left,right,flag;
long long sum;
}tree[]; int n,q;
int a[]; int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-f;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} void build(int node,int left,int right)
{
tree[node].left=left;tree[node].right=right;
if(left==right)
{
tree[node].sum=a[left];
return;
}
int mid=(left+right)>>;
build(node<<,left,mid);
build(node<<|,mid+,right);
tree[node].sum=tree[node<<].sum+tree[node<<|].sum;
} void pushdown(int node)
{
int x=tree[node].right-tree[node].left+;
tree[node<<].flag+=tree[node].flag;
tree[node<<|].flag+=tree[node].flag;
tree[node<<].sum+=(x-(x>>))*tree[node].flag;
tree[node<<|].sum+=(x>>)*tree[node].flag;
tree[node].flag=;
} void update(int node,int left,int right,int x)
{
int mid=(tree[node].left+tree[node].right)>>;
tree[node].sum+=(right-left+)*x;
if(tree[node].left==left&&tree[node].right==right)
{
tree[node].flag+=x;
return;
}
if(tree[node].left==tree[node].right) return;
if(tree[node].flag>) pushdown(node);
if(right<=mid) update(node<<,left,right,x);
else if(left>mid) update(node<<|,left,right,x);
else
{
update(node<<,left,mid,x);
update(node<<|,mid+,right,x);
}
tree[node].sum=tree[node<<].sum+tree[node<<|].sum;
} long long query(int node,int left,int right)
{
int mid=(tree[node].left+tree[node].right)>>;
if(tree[node].left==left&&tree[node].right==right)
return tree[node].sum;
if(tree[node].flag>) pushdown(node);
if(right<=mid)
return query(node<<,left,right);
else if(left>mid)
return query(node<<|,left,right);
else
return query(node<<,left,mid)+query(node<<|,mid+,right);
} int main()
{
n=read();
for(int i=;i<=n;i++)
a[i]=read();
build(,,n);
q=read();
for(int i=;i<=q;i++)
{
int t=read(),a=read(),b=read(),x;
if(t==)
{
x=read();
update(,a,b,x);
}
if(t==)
{
cout<<query(,a,b)<<endl;
}
}
return ;
}
Codevs1082 线段树练习 3的更多相关文章
- 线段树[To be continued]
目录 数据结构--线段树 一.定义 二.性质 三.基本操作 0.结构体 1.建树 2.单点查询 3.单点修改 4.区间修改 5.区间查询 四.题目 单点修改.区域查询模板 五.鸣谢 学姐的Blog 百 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
随机推荐
- 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)
本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...
- 如何杀死defunct进程
原文: How to kill defunct process 译者: youngsterxyf defunct进程是指出错损坏的进程,父子进程之间不会再通信.有时,它们会演变成“僵尸进程”,存留在你 ...
- Python文件内容修改
''' 吃的文件内容: 过油肉菜 尖椒菜 娃娃菜 ''' import os with open("吃的", mode="r", encoding=" ...
- https://www.safaribooksonline.com/home/
https://www.safaribooksonline.com/home/ https://www.safaribooksonline.com/library/view/instant-sikul ...
- ADC5513
一 C5513 u32 ADC5513_GetValue(void){ u32 ADValue,i; bool data_bit = false; C5513_SCK=0; C5513_CS ...
- h5点击区域和实际区域对不上
点击区域和实际区域对不上 然后点击后触发的其实是上面的区域,会导致事件触发错误
- java编程基础二进制
0.java编程基础 01.二进制(原码,反码,补码) 02.位运算 03.移位运算符 二进制 原码,反码,补码 1.基本概念 二进制是逢2进位的进位制,0,1是基本算符. 现在的电子计算机技术全部使 ...
- 1、http简介
HTTP 简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传 ...
- bug {was not declared in this scope}
使用自己定义的结构体作为返回值的时候,出现了 ...was not declared in this scope 检查了各种头文件,把缓存也都删掉了还是不行. 结果,发现,应该这样用vector< ...
- PHP针对二维数组无限遍历变形研究
一.需要变形的二维数组 $arr = Array( Array ( 'material_id' => 1, 'material_name' => '铜板纸', 'parent_id' =& ...