Можем ли мы использовать минимальное дерево сегментов, чтобы ответить ни на один из элементов, меньших k, в пределах определенного диапазона массива? - PullRequest
0 голосов
/ 06 января 2020

Я хочу использовать минимальное дерево сегментов, чтобы ответить ни на один из элементов, которые меньше k в указанном диапазоне массива c от l до r в несортированном массиве целых чисел. В запросе рекурсивной функции я возвращаю диапазон данного элемента дерева, если элемент дерева находится в пределах диапазона, а также минимум этого диапазона больше k, т.е. все элементы больше k, и возвращаю 0, если элемент дерева указывает только на один элемент массива, и это тоже меньше, чем к. Пожалуйста, скажите мне, что не так с моим подходом.

Здесь мы не берем ни элементов, ни запросов как входные n и q, затем для следующих n строк мы берем элементы массива как входные. Затем для каждого запроса нам нужно ответить на количество элементов в диапазоне [l, r], которые больше k.

void buildTree(int *a,int s,int e,int *tree,int index){
    //Base Case
    if(s==e){
        tree[index]=a[s];
        return;
    }
    //Recursive case
    int mid=(s+e)/2;
    buildTree(a,s,mid,tree,2*index);
    buildTree(a,mid+1,e,tree,2*index+1);
    tree[index]=min(tree[2*index],tree[2*index+1]);
    return;
}
int query(int *tree,int ss,int se,int qs,int qe,int k,int index){
    //Complete Overlap
    if(se==ss&&tree[index]<k)return 0;
    if(ss>=qs && se<=qe&& tree[index]>=k)
     return se-ss+1;
     //No Overlap
    if(ss>qe || qs>se)
     return 0;
     //Partial Overlap
    int mid=(ss+se)/2;
    int leftAns=query(tree,ss,mid,qs,qe,k,2*index);
    int rightAns=query(tree,mid+1,se,qs,qe,k,2*index+1);
    return leftAns+rightAns;
}
void updateNode(int *tree,int ss,int se,int i,int update,int index){
    //No Overlap
    if(i>se||i<ss)
    return;
    //LeafNode
    if(ss==se){
        tree[index]=update;
        return;
    }
    //Partial Overlap
    int mid=(ss+se)/2;
    updateNode(tree,ss,mid,i,update,2*index);
    updateNode(tree,mid+1,se,i,update,2*index+1);
    tree[index]=min(tree[2*index],tree[2*index+1]);
    return;
   }

int main(){
int n,q;
cin>>n>>q;
int arr[n];
for(int i=0;i<n;i++)cin>>arr[i];
int tree[4*n]; 
buildTree(a,0,n-1,tree,1);
for(int i=0;i<q;i++){
int l,r,k;
cin>>l>>r>>k;
cout<<query(tree,0,n-1,l-1,r-1,k,1)<<"\n";
}
return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...