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

本文共 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

你可能感兴趣的文章
APMServ 5.2.6 Win7 Apache启动失败,请检查相关配置
查看>>
了解痘痘起因才能彻底告别痘痘烦恼
查看>>
Zabbix安装
查看>>
Java 日志 详解
查看>>
openstack虚拟化技术和镜像制作
查看>>
一个超棒的jQuery通知栏插件 - jBar
查看>>
分享17个漂亮的电子商务网站
查看>>
JavaScript实用手册
查看>>
dpkg参数
查看>>
AS3!INT
查看>>
简述思科、华为交换机型号字母代表的意思
查看>>
memcache--mysql测试
查看>>
拷贝构造函数、拷贝函数、析构函数
查看>>
实战CGLib系列之proxy篇(一):方法拦截MethodInterceptor
查看>>
php 字符串截取
查看>>
ttcn-3
查看>>
00.java虚拟机的基本结构概念
查看>>
深入浅出 ES6:ES6 与 Babel - Broccoli 的联用
查看>>
ThreadLocal使用出现的问题
查看>>
关于十六进制和八进制负数的问题
查看>>