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] ...
随机推荐
- Ubuntu设置打不开排错
记录一次系统设置打不开排错过程 系统信息: ××××××:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu ...
- CentOS 7 部署 nginx-1.14.2
参考:http://www.linuxe.cn/post-168.html 链接:https://pan.baidu.com/s/1NzHIY7mYgHJ6yMF_rdd0ZQ 提取码:n8o9 下载 ...
- 洛谷P2939 [USACO09FEB]改造路Revamping Trails
题意翻译 约翰一共有\(N\))个牧场.由\(M\)条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场\(1\)出发到牧场\(N\)去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰 ...
- shell学习(10)- if的使用
在写Linux脚本的时候,经常会用到判断,这篇主要讲if的具体使用. if用法: if [ ] ;then command elif [ ] ;then command else command fi ...
- python进阶12 Redis
python进阶12 Redis 一.概念 #redis是一种nosql(not only sql)数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,还提 ...
- @Column 注解详情
@Column标记表示所持久化属性所映射表中的字段,该注释的属性定义如下: @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface ...
- Kestrel服务器
Kestrel服务器 什么是Kestrel服务器 Kestrel是开源的(GitHub提供的源代码),事件驱动的异步I / O服务器,用于在任何平台上托管ASP.NET应用程序.这是一个监听服务器和一 ...
- untiy3d开发环境搭建和开发准备
1.到untiy3d官网上下载untiy3d的软件(这里我使用的是个人版的5.3.61f做学习使用) 2.安装vs2012 3.因为unity3d和vs的版本有一定的版本对应关系,我这里使用vs201 ...
- MVC的viewPage 通用属性运用。
试想下在MVC的前端页面JS或者html中需要使用多语言,而后端的多语言是维护在资源文件中的,前端如果使用的话需要使用AJAX频繁的获取,一个页面中可能会存在大量的需要语言转换的地方,频繁使用AJAX ...
- Kendo UI 模板概述
Kendo UI 模板概述 Kendo UI 框架提供了一个易用,高性能的 JavaScript 模板引擎.通过模板可以创建一个 HTML 片段然后可以和 JavaScript 数据合并成最终的 HT ...