SPOJ GSS1 WA - Segment tree
SPOJ GSS1 WA - Segment tree
我正在尝试使用段树解决 SPOJ 问题 GSS1(你能回答这些查询吗 I)。我正在使用"init"方法来初始化树,并使用"查询"方法来获得范围 [i,j] 中的最大值。
限制 |A[i]|<= 15707 和 1<=N(元素数)<=50000。
int A[50500], tree[100500];
void init(int n, int b, int e) // n=1, b=lower, e=end
{
if(b == e)
{
tree[n] = A[b];
return;
}
init(2 * n, b, (b + e) / 2);
init(2 * n + 1, ((b + e) / 2) + 1, e);
tree[n] = (tree[2 * n] > tree[2 * n + 1]) ? tree[2 * n] : tree[2 * n + 1];
}
int query(int n, int b, int e, int i, int j) // n=1, b=lower, e=end, [i,j]=range
{
if(i>e || j<b)
return -20000;
if(b>=i && e<=j)
return tree[n];
int p1 = query(2 * n, b, (b + e) / 2, i, j);
int p2 = query(2 * n + 1, ((b + e) / 2) + 1, e, i, j);
return (p1 > p2) ? p1 : p2;
}
程序给出错误的答案.我在大多数情况下(负数,奇数/偶数N)对代码进行了解码,但我无法弄清楚算法出了什么问题。
如果有人能指出我正确的方向,我将不胜感激。
谢谢
我担心(接受的)答案在这里错过了一个非常重要的点。问题在于代码本身中使用的算法。代码说节点的答案是其子值的最大值。但很可能最大子阵列部分位于两个子阵列中。例如
-1 -2 3 4 5 6 -5 -10 (n=8)
代码将输出 11,而答案为 18。
您还需要调查此案以击败西澳。(我回答这个问题是因为接受的答案并不完全正确,也没有正确回答这个问题。
编辑:看来你的实现也是正确的,我只是有另一个。我们都误读了问题陈述。
我猜你用参数调用你的query
函数
query( 1, 0, n-1, x-1, y-1 );
我相信当你的 n 不是 2 的 pow 时,以这种方式处理段树是错误的。
我给你
- 将数组放大
tree
131072元素 (2^17),A
放大到 65536 (2^16); - 发现最小的
k
不小于n
,战俘为2; - 使用 -20000 将元素从
n
(从 0 开始)初始化为k-1
; - 使
n
等于k
; - 请务必致电
init(1,0,n-1);
希望这能帮助你击败西澳。
相关文章:
- 使用 boost::p roperty_tree::p tree 如何获取特定键的值
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- unordered_map segment fault
- Boost R-Tree中的最小边界矩形计算
- C++ EXC_BAD_ACCESS (Binary Tree)
- Boost::p tree - 访问列表中包含的属性树节点
- Deserilizing n-ary tree
- Balancing KD Tree
- 如何填充'Tree'结构'Declaratively'
- 为什么qmap使用skiplist而不是ob rb-tree
- 避免在节点中添加重复的子级,使用 Kasper Peeters 的 Tree.hh 库
- SPOJ GSS1 WA - Segment tree
- Flattening the tree
- C++ AVL Tree Deletion
- RedBlack and AVL tree c++
- 瓦尔格林德报道"brk segment overflow in thread #1"
- C++中已经有为 LinkedList、HashMap、Tree 等编写的类
- boost::p roperty_:tree - 解析和处理数据
- making tree with unordered_map
- AVL Tree in C++ Exception