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에서도 같은 결과를 얻을 수있는 방법이 있는지 알고 싶습니다.
C [bool 형식] (http://en.cppreference.com/w/c/types/boolean),'#include'그리고 매크로 대신 사용하십시오. –
오, 고마워. 나는 그것을 할 것이다 :) –
'return MAX (rangeMinquery (segTree, ...'함수 호출의 ** ** 많은 원인 **) ... – wildplasser