【发布时间】:2018-04-25 06:54:40
【问题描述】:
我正在尝试为竞争性编码问题创建一个分段树,并且该树使用数组表示。我有函数 rangeMinQuery 和 updateTree 在数组上执行中间作业。我无法弄清楚如何使用这些函数来操作所述数组。
#include <stdio.h>
#include <stdlib.h>
#define bool int
#define MAX(a,b) (((a)>(b))?(a):(b))
int upper_power_of_two(int v)
{
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
return v;
}
int getMid(int s, int e)
{
return s + (e -s)/2;
}
void updateValueUtil(int segTree[], int ss, int se, int i, int diff, int si)
{
// Base Case: If the input index lies outside the range of
// this segment
if (i < ss || i > se)
return;
// If the input index is in range of this node, then update
// the value of the node and its children
st[si] = st[si] + diff;
if (se != ss)
{
int mid = getMid(ss, se);
updateValueUtil(st, ss, mid, i, diff, 2*si + 1);
updateValueUtil(st, mid+1, se, i, diff, 2*si + 2);
}
}
void updateValue(int arr[], int segTree[], int n, int i, int new_val)
{
// Get the difference between new value and old value
int diff = new_val - arr[i];
// Update the value in array
arr[i] = new_val;
// Update the values of nodes in segment tree
updateValueUtil(st, 0, n-1, i, diff, 0);
}
int rangeMinquery(int segTree[],int qlow,int qhigh,int low,int high,int pos)
{
if(qlow<=low && qhigh >=high)
return segTree[pos];
if(qlow>high || qhigh <low)
return 9999999999;
int mid=(low+high)/2;
return MAX(rangeMinquery(segTree,qlow,qhigh,low,mid,2*pos+1),rangeMinquery(segTree,qlow,qhigh,mid+1,high,2*pos+2));
}
int main()
{
int n,q,x,l,r,i;
scanf("%d %d %d %d",&n,&q,&l,&r);
int a[n];
int segTree[upper_power_of_two(n)];
printf("%d\n",upper_power_of_two(n));
while(q--)
{
int cmd,pos1,pos2;
scanf("%d %d %d",&cmd,&pos1,&pos2);
if(cmd==1)
{
a[pos1]+=pos2;
updateValue(a,segTree,n,1,0);
}
if(cmd==2)
{
x=rangeMinquery(segTree,pos1,pos2,0,n,0);
printf("%d\n",x);
}
}
return 0;
}
如您所见,我正在尝试操作数组 segTree 并保留其中的值。我也想知道是否有一种方法可以在 JAVA 上实现相同的功能?
【问题讨论】:
-
C have a
booltype,#include <stdbool.h>并用它代替你的宏。 -
哦,谢谢。我会这样做的:)
-
return MAX(rangeMinquery(segTree,...会导致大量函数调用... -
这就是算法的工作原理……无论如何;那不是我要找的。我想知道如何访问操作这个数组,使其对所有函数都是全局的。
-
您需要将 segtree 数组作为通过引用传递给您的函数调用。 check here how
标签: c arrays tree segment-tree