
数据结构:树状数组
文章平均质量分 62
BRCOCOLI
初学者 记录成长 Fighting
展开
-
树状数组总结
树状数组适合单个元素经常修改而且还反复要求部分的区间的和的情况。 树状数组的所有题线段树都可以写,但相对而言编程效率和程序运行效率更加高 C[]只是一个求和工具 ,每个C[i]最后一个元素都是A[i] , C[i] 中有lowbit[i]个元素,所以C[i] 就是 A[i-lowbit[i]+1]~A[i] 的和 C[]的计算:C[k] = sum(k) – sum(k-l原创 2016-07-25 22:32:11 · 211 阅读 · 0 评论 -
POJ 3321 Apple Tree *
改变某点值,计算和很像树状数组 很难想到的是如何把它变为区间 具体做法是做一次dfs,记下每个节点的开始时间Start[i]和结束时间End[i], 那么对于i节点的所有子孙的开始时间和结束时间都应位于Start[i]和End[i]之间 然后用树状数组C统计Start[i]到End[i]之间的附加苹果总数。 这里用树状数组统计区间可以用Sum(End[i])-Sum(Start[原创 2016-07-25 22:43:33 · 280 阅读 · 0 评论 -
POJ 2182 Lost Cows树状数组 *
题目地址:http://poj.org/problem?id=2352 a[i]表示i排第几 每个位置i代表,1~i有几个比i小的数 可以从倒着来放数字,最后一个数n就是a[n]+1,因为只要前面有a[n]个比他小的数就好了,那么就是从小到大第a[n]个数 倒数第二个数也是这样,因为只要考虑在他前面的数 所以基本算法就是在待选的数中选第a[i]个放在i的位置上,当然要从后往前放原创 2016-08-27 15:15:52 · 443 阅读 · 0 评论 -
POJ 2352 Stars .
题目地址:http://poj.org/problem?id=2352 #include #include #include #include #include using namespace std; const int maxn=32000+5; int lowbit[maxn],C[maxn]; int level[maxn]; int inline getlowbit(int i) {原创 2016-08-27 16:25:58 · 430 阅读 · 0 评论 -
POJ 3067 Japan 树状数组 .
题目地址:http://poj.org/problem?id=3067 要用long long类型保存答案,不然WA #include #include #include #include #include using namespace std; typedef pair Edge; typedef long long LL; const int maxn=1000+5; int lowbi原创 2016-08-29 14:40:30 · 398 阅读 · 0 评论