簡體   English   中英

為什么要了解此范圍最小查詢代碼?

[英]Why getting tle in this Range Minimum Query code?

我正在嘗試解決一個非常基本的問題,該問題只涉及范圍最小查詢的實現。問題的鏈接是

https://www.hackerearth.com/practice/data-structures/advanced-data-structures/segment-trees/tutorial/

但是我超出了時間限制。 請有人幫助調試我的代碼。

#include <bits/stdc++.h>
#define inf 1000000000000000000
using namespace std;

vector<long long> segTree(2000005 , 0);
void createTree(vector<long long> v);
void createTreeUtil(vector<long long> v , int s,int e , int pos);
void updateTree(int x , int value , int n);
void updateTreeUtil(int s , int e , int pos , int x , int value);
long long getMinUtil(int s , int e , int pos , int srange , int erange);

long long getMin(int s , int e , int n);
int main(){
    int n,q;
    cin >> n >> q;

    vector<long long> v(n);
    for(int i=0;i<n;++i) cin >> v[i];
    //cout << "yes" << endl;
    createTree(v);
    /*cout << "seg tree is " ;
    for(int i=0;i<segTree.size();++i) cout << segTree[i] << " ";
    cout << endl;*/
    //cout << "yes" << endl;
    while(q--){
        int x , y;
        char c;
        cin >> c >> x >> y;
        if(c == 'u'){
            --x; 
            updateTree(x , y , n);
        }
        else{
            --x , --y; 
            cout << getMin(x , y , n) << endl;
        }
    }


    return 0;
}

void createTree(vector<long long> v){

    int l = v.size();
    createTreeUtil(v , 0 , l-1 , 0);
}

void createTreeUtil(vector<long long> v , int s,int e , int pos){
    if(s>e) return;
    int left = 2*pos+1 , right = 2*pos+2;
    if(s==e){
        segTree[pos] = v[s];
        return;
    }
    int mid = (s+e)/2;
    createTreeUtil(v , s , mid , left);
    createTreeUtil(v , mid+1 , e , right);
    segTree[pos] = min(segTree[left] , segTree[right]);

}

void updateTree(int x , int value , int n){

    updateTreeUtil(0 , n-1 , 0 , x , value);

}

void updateTreeUtil(int s , int e , int pos , int x , int value){
    if(s == e){

        if(s == x) segTree[s] = value;
        return;
    }
    if(x<s || x>e) return;
    int left = 2*pos+1 , right= 2*pos+2 , mid = (s+e)/2;
    updateTreeUtil(s , mid , left , x , value);
    updateTreeUtil(mid+1 , e , right , x , value);
    segTree[pos] = min(segTree[left] , segTree[right]);
}

long long getMin(int s , int e , int n){

    return getMinUtil(0 , n-1 , 0 , s , e);

}

long long getMinUtil(int s , int e , int pos , int srange , int erange){
    int mid = (s+e)/2 , left = 2*pos+1 , right = 2*pos+2;
    if(s > erange || e < srange) return inf;
    if(s >= srange && e <= erange) return segTree[pos];
    return min(getMinUtil(s , mid , left , srange , erange) ,               getMinUtil(mid+1 , e , right , srange , erange));
}

提前致謝

超過了時間限制,因為C ++按值傳遞參數。

這意味着每次調用createTreeUtil時,它都會復制包含100,000個元素的輸入向量。

嘗試更改:

void createTree(vector<long long> v);
void createTreeUtil(vector<long long> v , int s,int e , int pos);

使用參考:

void createTree(vector<long long> &v);
void createTreeUtil(vector<long long> &v , int s,int e , int pos);

(您將需要在聲明函數和實際定義函數的文件頂部都更改這些簽名。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM