Exemple #1
0
 static void Main(String[] args) {
     string[] strs;
     strs = Console.ReadLine().Split(' ');
     var n = int.Parse(strs[0]);
     var t = int.Parse(strs[1]);
     var children = new List<int>[n + 1];
     var hasParent = new bool[n + 1];
     
     for (var i = 1; i < n; ++i)
     {
         strs = Console.ReadLine().Split(' ');
         var parent = int.Parse(strs[0]);
         var child = int.Parse(strs[1]);
         if (children[parent] == null)
         {
             children[parent] = new List<int>();
         }
         children[parent].Add(child);
         hasParent[child] = true;
     }
     
     int root = 0;
     for (var i = 1; i <= n; ++i)
     {
         if (!hasParent[i])
         {
             root = i;
             break;
         }
     }
     
     long result = 0;
     var visitedNodes = new CountTree(1, n);
     visitedNodes.Add(root);
     var stack = new Stack<StackElement>();
     stack.Push(new StackElement { Lable = root, CurrentChildIndex = 0 });
     
     while (stack.Count > 0)
     {
         var node = stack.Peek();
         var childrenCount = children[node.Lable] == null ? 0 : children[node.Lable].Count; 
         if (node.CurrentChildIndex >= childrenCount)
         {
             visitedNodes.Remove(node.Lable);
             stack.Pop();
         }
         else
         {
             var nextNode = children[node.Lable][node.CurrentChildIndex];
             var lower = nextNode - t;
             var upper = nextNode + t;
             result += visitedNodes.GetCountLessThanOrEqualTo(upper) - visitedNodes.GetCountLessThanOrEqualTo(lower - 1);
             ++node.CurrentChildIndex;
             visitedNodes.Add(nextNode);
             stack.Push(new StackElement { Lable = nextNode, CurrentChildIndex = 0 });
         }
     }
     
     Console.WriteLine(result);
 }