树状数组--快捷的线段树
问题概述:先输入一个数n,接下来输入n个数,然后输入一个指令,其中(Add i j)i和j为正整数,表示第i个营地增加j个人,(Sub i j)i和j为正整数,表示第i个营地减少j个人,(Query i j)i和j为正整数,i<=j,表示询问第i到第j个营地的总人数,(End)表示结束,这条命令在每组数据最后出现,对于每个Query询问,输出该区间中的总人数(T组实例)
输入样例: 对应输出:
1 Case 1:
10 6
1 2 3 4 5 6 7 8 9 10 3
Query 1 3 59
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End
大神:http://blog.csdn.net/int64ago/article/details/7429868
解析在代码中
#include<stdio.h>
#include<string.h>
int n;
int c[50005];
void Update(int x, int k);
int Print(int k);
int lowbit(int k)
{return k&-k; /*把k的二进制的高位1全部清空,只留下最低位的1*/
}
int main(void)
{int T, cas, i, a, b;char str[12];scanf("%d", &T);cas = 1;while(T--){memset(c, 0, sizeof(c)); /*将数组的所有元素全部重置为0*/scanf("%d", &n);for(i=1;i<=n;i++){scanf("%d", &a);Update(a, i); /*每输入一个数,更新一次树状数组*/}printf("Case %d:\n", cas++);while(scanf("%s", str), strcmp(str, "End")!=0){scanf("%d%d", &a, &b);if(str[0]=='A')Update(b, a);if(str[0]=='S')Update(-b, a);if(str[0]=='Q')printf("%d\n", Print(b)-Print(a-1));}}return 0;
}void Update(int x, int k) /*树状数组的更新*/
{while(k<=n){c[k] += x;k += lowbit(k);}
}int Print(int k) /*查询1-k的区间和*/
{int ans;ans = 0;while(k>0){ans += c[k];k -= lowbit(k);}return ans;
}
树状数组--快捷的线段树相关推荐
- 【BZOJ2441】【中山市选2011】小W的问题(树状数组+权值线段树)
传送门 由于一个www不好统计,我们考虑拆成222个vvv来统计,也就是"312"和"213"这样的 把答案统计在"2"处,两边相乘就是答案 ...
- HDU 4417 Super Mario(线段树||树状数组+离线操作 之线段树篇)
Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...
- 数据结构 【树状数组】【线段树】【珂朵莉树】
一.区间合并 1.AcWing245你能回答这些问题吗 分析: 线段树.维护四个变量,即可实现区间合并. mx 区间最大连续子段和 mx_l 以区间左端点为左界的最大连续字段和 mx_r 以区间左端点 ...
- 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...
- 洛谷 P3368 【模板】树状数组 2(线段树区间加单点查找)
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个 ...
- HDU 4325 离散化+树状数组 或者 不使用树状数组
题意:给出一些花的开放时间段,然后询问某个时间点有几朵花正在开放. 由于ti<1e9,我们需要先将时间离散化,然后将时间点抽象为一个数组中的点,显然,我们需要进行区间更新和单点查询,可以考虑线段 ...
- php 树状数组公式,PY个树状数组
树状数组比较简单,于是就挑它下手了... 于是生活终于也对咱下手了... 要讲的就两个东西,一个是开数组,全局变量写最前面,数组是这么开的: f=[0 for i in range(500005)] ...
- 吊打线段树的超级树状数组
你是否讨厌线段树那冗长的代码?你是否还在因为线段树的难调试而满头♂dark汗?那么,请不要错过!超级树状数组特价!只要998,只要998! ##¥--#--¥%--&%¥--ER#%$#$#^ ...
- VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 线段树 or 树状数组+二分
http://codeforces.com/problemset/problem/159/C 题意: 给你一个字符串s,给出一个数k,k倍的s串组成新串str.然后给出n个操作,每个操作对应着pi,c ...
最新文章
- 030_jQuery Ajax的get方法
- js实现返回顶部功能的解决方案
- 【Python数据分析】四级成绩分布 -matplotlib,xlrd 应用
- 函数计算如何帮助语雀构建稳定且安全的业务架构?
- Java基础05 break和continue比较区别
- Spring Boot整合 Thymeleaf 模板引擎
- 8月7日晚八点分享-推荐系统面试/概览
- EPUB阅读工具-读者推荐
- 我的数据分析师转型之路,从零到阿里数据分析师
- 并联串联混合的电压和电流_并联电阻的计算公式(附各种并联电阻网络图解)...
- 怎么彻底卸载cad2017_怎么彻底卸载删除cad
- OpenCV/kornia/Pillow/Halcon/NI Vision/MIL/*计算机视觉资料汇总
- 个人赛 A 题 传球游戏(ball)
- [分享] 兰迪·波许教授的最后一课[PDF/PPT/AVI]
- 从来没有一种工作叫:钱多事少离家近,位高权重责任轻
- [剑指offer]顺时针打印矩阵
- Oracle的子查询和程序包上机1
- STM32_HAL库_常用函数库
- 毕业论文记录——排版
- Macromedia的历史