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;
}

你可能感兴趣的:(CSP,CCF,算法)