树状数组
码不停Tick
这个作者很懒,什么都没留下…
展开
-
HDU1556 树状数组,线段树区间更新两种方法(主要树状数组)
树状数组 #include #include const int MAXN=110000; int n,c[MAXN]; int lowbit(int x) //计算2^k { x=x&-x; return x; } void update(int num,int val) //向下查询,num是要更新的子节点,val是要修改的值 { while(num>0)转载 2017-07-30 00:37:23 · 320 阅读 · 0 评论 -
hdu 2642 (summerIII J) 二维树状数组
#include #include #include using namespace std; const int maxn=4000; int c[maxn][maxn],n; char str[10]; int lowbit(int x) { return x&(-x); } void update(int i,int j,int val) { for(int x=i;x<原创 2017-07-31 21:08:41 · 241 阅读 · 0 评论 -
poj 3264 (summerIII O) j树状数组 ST表(区间最值查询)
#include #include #include using namespace std; const int maxn= 100000+50; int n,m,a[maxn],mx[maxn][50],mn[maxn][50];//这里mx[maxn][范围内尽量取大一点] void init(){ int m=floor(log((double)n)/log(2.0)); for(i原创 2017-07-31 22:41:30 · 257 阅读 · 0 评论 -
hdu1892 (summer III see you)
本题也属于比较简单的二维树状数组问题。 思路很简单:单点向上记录,向下求和,不过一直AC不了,总结一下每次出现错误的原因: 1、一开始mle。。。后来查了一下,是因为数组开得太大,看来数组还是要看情况来开,根据情况,适合就好。 2、然后就是各种WA。。。对比AC代码后发现,是因为一下两个原因:a、对于单点书本的判断的表达式书写出错。(应该和区域的计算表达式差不多) b、除了add外其他的up原创 2017-08-02 00:36:56 · 399 阅读 · 0 评论 -
POJ3468 树状数组的区间更新和区间求和
这道题由于数据较大,不能简单地使用一般的树状数组单点更新和单点向下求和,而应该使用区间范围的更新和求和。 不过区间求和的公式证明看得有点久,但最终还是弄懂了,以下为链接:点击打开链接 知道这个以后直接用就好了,不过要注意更新和查询时的左右边界的取值。 #include #include using namespace std; const int maxn=400000+50原创 2017-08-04 10:08:47 · 371 阅读 · 0 评论 -
树状数组技巧总结
树状数组一般用来维护区间的前缀和,而线段树其实更适合用来解决RMQ问题。但是因为现在还没有复习线段树,所以先用着树状数组。(主要是好写) 树状数组基本的操作:区间和和单点修改,都可以在刘汝佳的训练指南里找到,这里不做详细说明。 主要总结以下几点: 1、树状数组解题的常规套路。(其实也就是前缀和的套路) 2、树状数组的区间最值查询 3、树状数组的区间修改以及区间修改后的区间和查询原创 2018-02-03 12:36:10 · 334 阅读 · 0 评论 -
树状数组进阶应用:区间更新、区间最值查询
区间最值查询:注意这里的init和原树状数组的add有点相似,但不同,add是在原来数的基础上加值,这里是直接初始化,query和sum也同样道理 poj3264(题意见 挑竞) #include #include #include #include #include #define ll long long #define inf 0x3f3f3f3f using namesp原创 2018-02-03 12:48:30 · 274 阅读 · 0 评论