博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树状数组模板
阅读量:6992 次
发布时间:2019-06-27

本文共 1329 字,大约阅读时间需要 4 分钟。

3198: 区间和 分享至QQ空间

Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte
Total Submit: 643            Accepted:202

Description

给定n个数据,有两个操作,加减其中的一个数据,当然还可查询在某段数据的和。

Input

 

输入数据有多组,每组数据的

第一行输入n,1=<n<=500000,代表数据的个数。
第二行输入具体数据,数据为正整数,范围在1到10000.
第三行输入m,1<=m<=100000,表示操作的次数。包含了修改和查询操作。
下面m行就是具体的操作了。
C i x  表示为第i个元素加上x,x范围在1到10000.
Q i j  表示查询区段i到j的和。保证输入的i<=j.
以EOF结束。

 

Output

输出查询后的区段和。

Sample Input

8

1 5 9 11 2 8 15 6
4
Q 1 3
C 2 10
Q 1 4
Q 2 5

Sample Output

15

36
37

单点更新,单点查询

区间查询就是查询把值放在段里面

#include 
typedef __int64 ll;const int N =500005;ll c[N];int n;int lowbit(int x){ return x&-x;}void add(int x,int d){ while(x<=n) { c[x]+=d; x+=lowbit(x); }}ll sum(int x){ ll ans=0; while(x>0) { ans+=c[x]; x-=lowbit(x); } return ans;}int main(){ while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) c[i]=0; for(int i=1;i<=n;i++) { int x; scanf("%d",&x); add(i,x); } int m; scanf("%d",&m); while(m--) { getchar(); char c; int a,b; scanf("%c%d%d",&c,&a,&b); if(c=='Q')printf("%I64d\n",sum(b)-sum(a-1)); else add(a,b); } } return 0;}

想学习更多技巧可以到的

 

转载于:https://www.cnblogs.com/BobHuang/p/7702209.html

你可能感兴趣的文章
委托和回调函数例子
查看>>
XML与HTML 区别
查看>>
1312:【例3.4】昆虫繁殖(递推算法)
查看>>
继承,多态,抽象,接口
查看>>
C#ADO.NET基础一
查看>>
一个文字横向滚动的JavaScript文档
查看>>
junit整合spring
查看>>
java正则表达式【大全】
查看>>
mac上git安装与github基本使用
查看>>
如何为引用类型如何重写Object.Equals()方法?
查看>>
下拉顶部刷新简单实现
查看>>
Linux的基本配置
查看>>
Django框架之模型层(二)
查看>>
who 查看系统登录用户
查看>>
java语言中application异常退出和线程异常崩溃的捕获方法,并且在捕获的钩子方法中进行异常处理...
查看>>
架构师速成6-初中 分类: 架构师速成 2015-0...
查看>>
最新---java多线程下载文件
查看>>
【二】调通单机版的thrift-C++版本
查看>>
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
查看>>
ASP.NET MVC 主要的四种过滤器和三种具体实现类
查看>>