2017-11-12 16 views
0

경쟁력있는 코딩 문제를위한 세그먼트 트리를 만들려고하는데이 트리는 배열을 사용하여 표현됩니다. 배열에 중간 작업을 수행하는 rangeMinQuery 및 updateTree 함수가 있습니다. 함수를 사용하여 배열을 조작하는 방법을 알아낼 수 없습니다. 내 C 프로그램의 모든 기능에서 어레이에 액세스하는 방법은 무엇입니까?

#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에서도 같은 결과를 얻을 수있는 방법이 있는지 알고 싶습니다.

+0

C [bool 형식] (http://en.cppreference.com/w/c/types/boolean),'#include '그리고 매크로 대신 사용하십시오. –

+0

오, 고마워. 나는 그것을 할 것이다 :) –

+0

'return MAX (rangeMinquery (segTree, ...'함수 호출의 ** ** 많은 원인 **) ... – wildplasser

답변

0

당신은 글로벌 포인터를 할 수 있습니다 ...

//in global scope 
int *segTree; 

... 그리고 malloc() 연산자를 사용하여 배열을 만들 :

//in main() 
segTree = malloc(upper_power_of_two(n) * sizeof(int)); 

을 이제 배열은 글로벌이다. 그러나 프로그램을 끝내기 전에 free(segTree)을 기억하십시오.

btw. 절대 주어진 코드에서와 같이 가변 크기의 로컬 배열 (스택에)을 생성해야합니다.