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