CCF 201803-5二次加算


データ規模は比較的大きく,比較的直感的な幅探索アルゴリズムを思いついた.サンプルが合格した.しかし、コミットは20分しかなく、実行はタイムアウトしました.効率の高いアルゴリズムを求める.
#include
#include 
#include
#include
#include
using namespace std;
const int Q = 1000000007;
//const int INF = 1e6+5;//    ,         
struct Edge{
 int from, to;//dist    
 //Edge(int u, int v, int d):from(u),to(v),dist(d){}
 Edge(int u, int v):from(u),to(v){}
};
struct HeapNode{
 int d;//  
 int u;//    
 bool operator < (const HeapNode& rhs) const {
  return d > rhs.d;
 } 
};
struct Tree{
 int n;//      
 vector value;//      
 vector edges;
 vector > G;//    
 
 vector done;    //        
 vector p; //  i     p[i] 
 vector > status;
 vector d;
 
 void init(int n){
  this->n = n;
  value.resize(n); 
  edges.clear();
  G.resize(n, vector());
  
  done.clear();
  p.resize(n);
  status.clear();
  d.clear();
  //p.clear();
 }
 void addEdge(int from, int to){
  edges.push_back(Edge(from, to));
  int m = edges.size();
  G[from].push_back(m-1);
  G[to].push_back(m-1); //    
 }
 void bfs(int root, int end){
  done.clear();
  done.resize(n, false);
  p[root] = -1;
  //p.resize(n, -1);
  queue Q;
  for(int i=0;i Q;
  for(int i=0;i(n,false));
  long long ss = 0;
  for(int i=1;i=L && d[j]<=R && !status[i][j]){
     //cout<>T;
 for(int p=0;p>n>>m>>L>>R;
 Tree S;
 S.init(n+1);
 for(int i=1;i<=n;i++){
  cin>>S.value[i];
 }
 int temp;
 for(int i=1;i>temp;
  S.addEdge(temp,i+1);
 }
 //S.display();
 
 int u,v,d;
 for(int i=0;i>u>>v>>d;
  S.add_d(u,v,d);
  //S.display();
  S.sum(L, R);
 }
 
 }
 
 return 0;
}