HDU 4123

来源:互联网 发布:淘宝试用中心有效果吗 编辑:程序博客网 时间:2024/06/05 20:33
const  int  maxn = 50010 ;struct   Edge{         int  v , w , next ;}e[maxn*2];int   id , g[maxn] ;void   add(int u , int v , int w){       e[id].v = v ;       e[id].w = w ;       e[id].next = g[u] ;       g[u] = id++ ;}int    fmaxc[maxn] , fid[maxn] ;int    smaxc[maxn] , sid[maxn] ;void   dfs1(int u  , int fa){       fmaxc[u] = smaxc[u] = fid[u] = sid[u] = 0 ;       for(int i = g[u] ; i != -1 ; i = e[i].next){           int v = e[i].v  ;           if(v == fa)  continue  ;           dfs1(v , u) ;           if(fmaxc[v] + e[i].w > smaxc[u]){                smaxc[u] = fmaxc[v] + e[i].w ;                sid[u]   = v ;                if(fmaxc[u] < smaxc[u]){                    std::swap(fmaxc[u] , smaxc[u]) ;                    std::swap(fid[u] , sid[u]) ;                }           }       }}void   dfs2(int  u  , int fa){       for(int i = g[u] ; i != -1 ; i = e[i].next){           int v = e[i].v ;           if(v == fa)  continue  ;           if(fid[u] == v){                if(smaxc[u] + e[i].w > smaxc[v]){                     smaxc[v] = smaxc[u] + e[i].w  ;                     sid[v] = u ;                     if(fmaxc[v] < smaxc[v]){                        std::swap(fmaxc[v] , smaxc[v]) ;                        std::swap(fid[v] , sid[v]) ;                     }                }           }           else{                if(fmaxc[u] + e[i].w > smaxc[v]){                     smaxc[v] = fmaxc[u] + e[i].w  ;                     sid[v] = u ;                     if(fmaxc[v] < smaxc[v]){                        std::swap(fmaxc[v] , smaxc[v]) ;                        std::swap(fid[v] , sid[v]) ;                     }                }           }           dfs2(v , u) ;       }}int    n ;int    cmax[maxn][20] , cmin[maxn][20] ;int    tlog[maxn] ;void   rmqinit(){       for(int i = 1 ; i <= n ; i++) cmax[i][0] = cmin[i][0] = fmaxc[i] ;       tlog[0] = tlog[1] = 0 ;       for(int i = 2 ; i <= n ; i++)  tlog[i] = tlog[i>>1] + 1 ;       for(int j = 1 ; j <= tlog[n] ; j++){          for(int i = 1 ; i + (1<<j) - 1 <= n ; i++){              cmax[i][j] = std::max(cmax[i][j-1] , cmax[i + (1<<(j-1)) ][j-1]) ;              cmin[i][j] = std::min(cmin[i][j-1] , cmin[i + (1<<(j-1)) ][j-1]) ;          }       }}int    rmq(int l , int r){       int i = tlog[r-l+1] ;       return   std::max(cmax[l][i] , cmax[r - (1<<i) + 1][i])              - std::min(cmin[l][i] , cmin[r - (1<<i) + 1][i]) ;}int    main(){       int   m , i , u , v , w  , d , idx , t ;       while(cin>>n>>m){            if(n == 0 && m == 0)  break ;            id = 0 ;            memset(g , -1 , sizeof(g)) ;            for(i = 1 ; i < n ; i++){               scanf("%d%d%d" , &u , &v , &w) ;               add(u , v , w) ;               add(v , u , w) ;            }            dfs1(1 , 1) ;            dfs2(1 , 1) ;            rmqinit() ;            while(m--){                  scanf("%d" , &d) ;                  idx = 1 ;                  t = 0 ;                  for(i = 1 ; i <= n ; i++){                      while(idx <= i && rmq(idx , i) > d) idx++ ;                      t = std::max(t , i - idx + 1) ;                  }                  printf("%d\n" , t) ;            }       }       return  0 ;}

0 0