Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 超出时间限制:代码强制686D_C++_Performance - Fatal编程技术网

C++ 超出时间限制:代码强制686D

C++ 超出时间限制:代码强制686D,c++,performance,C++,Performance,我试图在codeforces上解决这个问题,但我得到了TLE。你能告诉我我的解决方案花了这么多时间吗?我使用的是数据结构还是算法效率低下?我怎样才能改进它 #include <iostream> #include <vector> using namespace std; int assignweights(int index, int weights[], vector<vector<int> > &v){ if(v[index

我试图在codeforces上解决这个问题,但我得到了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;
}
#包括
#包括
使用名称空间std;
整数赋值权重(整数索引,整数权重[],向量和v){
如果(v[index].size()==0){
返回0;
}否则{
向量子项=v[索引];
int结果=0;
结果+=children.size();
对于(inti=0;i>n>>q;
向量v;
对于(int i=0;ia;
v[a-1]。推回(i);
}
整数权重[n];
对于(int i=0;iindex;
索引--;
int结果=0;
getcentroid(索引、v、权重、结果、权重[索引]);

cout在最坏的测试用例中,您的解决方案的复杂性为O(n*q)。 我认为这个问题的最佳解决方案是,对于树的每个节点,在其上的索引1,2,4,…2^x处创建其后代的向量。
对于该向量,对于每个查询,都需要O(log(n))才能找到答案。

可以避免
main
函数中的第一个循环。第二个循环可以是对
std::copy
的单个调用(尽管循环可以为向量保留内存)在<代码>赋值< /COD>和 GeCytoLoo.<代码>函数中,您复制一个向量,而不是引用。可能还有其他小的东西可以优化或改进。哦,C++没有定义“代码>权重<代码> >在<代码>主< /COD>函数真的是无效的。使用<代码> STD::向量< /代码>这里也是。
向量子对象
-->
常量向量和子对象
。但函数中的向量有参考符号“&”parameters@shotakobaxidze在函数参数中,是的,但是局部变量
子变量如何?