线段树||树状数组||划分树
muczzcy
这个作者很懒,什么都没留下…
展开
-
树状数组求区间最大值一类问题
树状数组(Binary Index Tree)利用二进制的一些性质巧妙的划分区间,是一种编程,时间和空间上都十分理想的求区间和的算法,同样我们可以利用树状数组优美的区间划分方法来求一个序列的最值 约定以 num[] 表示原数组, 以 idx[] 表示索引数组, Lowbit(x)=x&(-x) 树状数组求和时通过构造数组 idx[] 使 idx[k]=sum(num[tk]), tk转载 2013-01-24 08:44:05 · 1070 阅读 · 0 评论 -
hdu 1754 I hate it
解题思路:此题就是树状数组求最大值的模版题。按照实际效果树状数组比线段树的时间更少些~编程复杂度更小。 Problem : 1754 ( I Hate It ) Judge Status : Accepted RunId : 7538799 Language : G++ Author : CherryChou Code Render Status : Rendered原创 2013-01-24 11:45:27 · 381 阅读 · 0 评论 -
HDU 2665 Kth number
/*划分树模版题*/ #include #include #include using namespace std; const int M=100005; int tree[20][M],sorted[M]; int toLeft[20][M]; void build(int level,int left,int right){ if(l原创 2013-02-12 15:23:00 · 258 阅读 · 0 评论 -
hdu 1394 Minimum Inversion Number
/*思路: 求逆序数: 树状数组解决:就是逆向扫描原序列,扫描到a[i]时,累加在其后面a[i+1..N]中 小于它的个数 = sum(a[i]-1); 树状数组中逆向插入元素,当插入p[i]时,明显与它构成逆序数对的数量就等于树状数组[1..p[i]-1]这个区间的和 循环轮换的可以用数学方法O(1)求出. 单个case时间复杂度: O(NlogN)*原创 2013-01-23 09:06:12 · 295 阅读 · 0 评论 -
POJ 2104 K-th Number
/*划分树基础题模版*/ #include #include #include using namespace std; const int M=100005; int tree[20][M],sorted[M]; int toLeft[20][M]; void build(int level,int left,int right){ if原创 2013-02-12 15:21:34 · 300 阅读 · 0 评论 -
HDU 3473 Minimum Sum
/*题意:给出n个数x1,x2...xn.进行m次操作,每次给出一个区间[l ,r].求出xi属于区间[l, r]使得该区间的每个数与xi的差之和最小,并求出该和。解决方法:划分树。*/ #include #include #include #include using namespace std; const int MAXN=200010; int tree[原创 2013-02-12 15:25:25 · 314 阅读 · 0 评论 -
划分树的用法(一):查询区间第K大值值(poj2104)
可能是我太笨的原因,一个简单的划分树竟然用了三四天才慢慢能把最基础的用法领悟到。其实也挺好的,用时间去拼聪明人的智力,只要能领悟到,我们的收获是相同的! 好了,言归正传!划分树是线段树的深化,其本质还是线段树。划分树可以解决这样的问题(我现在也只读懂了怎么解决这一个问题):查询序列中动态区间的第k大值。比如:POJ2104(http://poj.org/problem?id=2104)。转载 2013-02-12 15:29:47 · 336 阅读 · 0 评论 -
hdu 1166 敌兵布阵
第一道树状数组。题很水。继续下一道。。。让我疑惑在这。。。 #include #include #include #include using namespace std; int n; int a[50010],p[50010];//a树状数组 int lowb(int t){return t&(-t);} void add(int i,int v){ for(;原创 2013-01-21 10:48:02 · 281 阅读 · 0 评论