TIME_LIMIT_EXCEEDED:Codeforces 686D

时间:2016-08-11 09:16:52

标签: c++ performance

我试图在代码http://codeforces.com/contest/686/problem/D上解决这个问题,但我得到了TLE。你能告诉我在我的解决方案中花了那么多时间吗?是我使用的数据结构还是算法效率低下?我该如何改进呢?

#include <iostream>
#include <vector>
using namespace std;

int assignweights(int index, int weights[], vector<vector<int> > &v){
    if(v[index].size()==0){
        return 0;
    }else{
        vector<int> children=v[index];
        int result=0;
        result+=children.size();
        for(int i=0; i<children.size(); ++i){
            result+=assignweights(children[i], weights, v);
        }
        weights[index]=result;
    }
    return weights[index];
}


void getcentroid(int index, vector<vector<int> > &v, int weights[], int & result, int n){
        vector<int> children=v[index];
        bool b=false;
        for(int i=0; i<children.size(); ++i){
            if(weights[children[i]]+1>n/2){
                if(!result)getcentroid(children[i], v, weights, result, n);
                else break;
                b=true;
            }
        }
    if(!b){
        result=index+1;
    }
}


int main(){
    int n, q;
    cin>>n>>q;
    vector<vector<int> > v;
    for(int i=0; i<n; ++i){
        vector<int> vv;
        v.push_back(vv);
    }
    for(int i=1; i<=n-1; ++i){
        int a;
        cin>>a;
        v[a-1].push_back(i);
    }
    int weights[n];
    for(int i=0; i<n; ++i){
        weights[i]=0;
    }
    assignweights(0, weights, v);
    for(int i=0; i<q; ++i){
        int index;
        cin>>index;
        index--;
        int result=0;
        getcentroid(index, v, weights, result, weights[index]);
        cout<<result<<endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

在较差的测试案例中,您的解决方案可能具有O(n * q)的复杂度。 我认为针对此问题的最佳解决方案是针对树的每个节点,在其上的索引1,2,4,... 2 ^ x处创建其后代的向量。 使用该向量,对于每个查询,都需要O(log(n))来找到答案。