2017-11-12 2 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。 決して与えられたコードのように、可変サイズのローカル配列(スタック上に)を作成する必要があります。

関連する問題