Найдите количество пар идеальных узлов в данном дереве
Учитывая дерево из N узлов и целое число K , каждый узел пронумерован от 1 до N. Задача - найти количество пар идеальных узлов в дереве.
Пара узлов (a, b) называется идеальной, если
- a является предком b .
- И, abs (a - b) ≤ K
Примеры:
Вход:

К = 2 Выход: 4 (1, 2), (1, 3), (3, 4), (3, 5) - такие пары. Входные данные: рассмотрим график в примере 1 и k = 3. Выход: 6 Такими парами являются (1, 2), (1, 3), (1, 4), (3, 4), (3, 5), (3, 6).
Подход: во- первых, нам нужно пройти по дереву с помощью DFS, поэтому нам нужно найти корневой узел, узел без родителя. По мере прохождения каждого узла мы сохраняем его в структуре данных, чтобы отслеживать всех предков для следующего узла. Перед тем как это сделать, получите количество предков узла в диапазоне [presentNode - k, presentNode + k], затем добавьте его к общему количеству пар.
Нам нужна структура данных, которая может:
- Вставляйте узел по мере обхода дерева.
- По возвращении удалите узел.
- Укажите количество узлов в диапазоне [presentNode - k, PresentNode + k], которые были сохранены.
Двоичное индексированное дерево выполняет три вышеуказанные операции.
Мы можем выполнить указанные выше 3 операции, инициализировав все значения индекса BIT равными 0, а затем:
- Вставьте узел, обновив индекс этого узла до 1.
- Удалите узел, обновив индекс этого узла до 0.
- Получите количество похожих пар предка этого узла, запросив сумму диапазона [presentNode - k, PresentNode + k]
Below is the implementation of the above approach:
C++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;#define N 100005int n, k;// Adjacency listvector<int> al[N];long long Ideal_pair;long long bit[N];bool root_node[N];// bit : bit array// i and j are starting and// ending index INCLUSIVElong long bit_q(int i, int j){ long long sum = 0ll; while (j > 0) { sum += bit[j]; j -= (j & (j * -1)); } i--; while (i > 0) { sum -= bit[i]; i -= (i & (i * -1)); } return sum;}// bit : bit array// n : size of bit array// i is the index to be updated// diff is (new_val - old_val)void bit_up(int i, long long diff){ while (i <= n) { bit[i] += diff; i += i & -i; }}// DFS function to find ideal pairsvoid dfs(int node){ Ideal_pair += bit_q(max(1, node - k), min(n, node + k)); bit_up(node, 1); for (int i = 0; i < al[node].size(); i++) dfs(al[node][i]); bit_up(node, -1);}// Function for initialisationvoid initalise(){ Ideal_pair = 0; for (int i = 0; i <= n; i++) { root_node[i] = true; bit[i] = 0LL; }}// Function to add an edgevoid Add_Edge(int x, int y){ al[x].push_back(y); root_node[y] = false;}// Function to find number of ideal pairslong long Idealpairs(){ // Find root of the tree int r = -1; for (int i = 1; i <= n; i++) if (root_node[i]) { r = i; break; } dfs(r); return Ideal_pair;}// Driver codeint main(){ n = 6, k = 3; initalise(); // Add edges Add_Edge(1, 2); Add_Edge(1, 3); Add_Edge(3, 4); Add_Edge(3, 5); Add_Edge(3, 6); // Function call cout << Idealpairs(); return 0;} |
Java
// Java implementation of the approachimport java.util.*;class GFG{ static final int N = 100005;static int n, k;// Adjacency list@SuppressWarnings("unchecked")static Vector<Integer> []al = new Vector[N];static long Ideal_pair;static long []bit = new long[N];static boolean []root_node = new boolean[N];// bit : bit array// i and j are starting and// ending index INCLUSIVEstatic long bit_q(int i, int j){ long sum = 0; while (j > 0) { sum += bit[j]; j -= (j & (j * -1)); } i--; while (i > 0) { sum -= bit[i]; i -= (i & (i * -1)); } return sum;}// bit : bit array// n : size of bit array// i is the index to be updated// diff is (new_val - old_val)static void bit_up(int i, long diff){ while (i <= n) { bit[i] += diff; i += i & -i; }}// DFS function to find ideal pairsstatic void dfs(int node){ Ideal_pair += bit_q(Math.max(1, node - k), Math.min(n, node + k)); bit_up(node, 1); for(int i = 0; i < al[node].size(); i++) dfs(al[node].get(i)); bit_up(node, -1);}// Function for initialisationstatic void initalise(){ Ideal_pair = 0; for (int i = 0; i <= n; i++) { root_node[i] = true; bit[i] = 0; }}// Function to add an edgestatic void Add_Edge(int x, int y){ al[x].add(y); root_node[y] = false;}// Function to find number of ideal pairsstatic long Idealpairs(){ // Find root of the tree int r = -1; for(int i = 1; i <= n; i++) if (root_node[i]) { r = i; break; } dfs(r); return Ideal_pair;}// Driver codepublic static void main(String[] args){ n = 6; k = 3; for(int i = 0; i < al.length; i++) al[i] = new Vector<Integer>(); initalise(); // Add edges Add_Edge(1, 2); Add_Edge(1, 3); Add_Edge(3, 4); Add_Edge(3, 5); Add_Edge(3, 6); // Function call System.out.print(Idealpairs());}}// This code is contributed by Amit Katiyar |
Python3
# Python3 implementation of the approachN = 100005Ideal_pair = 0# Adjacency listal = [[] for i in range(100005)]bit = [0 for i in range(N)]root_node = [0 for i in range(N)]# bit : bit array# i and j are starting and# ending index INCLUSIVEdef bit_q(i, j): sum = 0 while (j > 0): sum += bit[j] j -= (j & (j * -1)) i -= 1 while (i > 0): sum -= bit[i] i -= (i & (i * -1)) return sum# bit : bit array# n : size of bit array# i is the index to be updated# diff is (new_val - old_val)def bit_up(i, diff): while (i <= n): bit[i] += diff i += i & -i# DFS function to find ideal pairsdef dfs(node, x): Ideal_pair = x Ideal_pair += bit_q(max(1, node - k), min(n, node + k)) bit_up(node, 1) for i in range(len(al[node])): Ideal_pair = dfs(al[node][i], Ideal_pair) bit_up(node, -1) return Ideal_pair # Function for initialisationdef initalise(): Ideal_pair = 0; for i in range(n + 1): root_node[i] = True bit[i] = 0# Function to add an edgedef Add_Edge(x, y): al[x].append(y) root_node[y] = False# Function to find number of ideal pairsdef Idealpairs(): # Find root of the tree r = -1 for i in range(1, n + 1, 1): if (root_node[i]): r = i break Ideal_pair = dfs(r, 0) return Ideal_pair# Driver codeif __name__ == "__main__": n = 6 k = 3 initalise() # Add edges Add_Edge(1, 2) Add_Edge(1, 3) Add_Edge(3, 4) Add_Edge(3, 5) Add_Edge(3, 6) # Function call print(Idealpairs())# This code is contributed by# Surendra_Gangwar |
C#
// C# implementation of the// above approachusing System;using System.Collections.Generic;class GFG{ static readonly int N = 100005;static int n, k;// Adjacency liststatic List<int> []al = new List<int>[N];static long Ideal_pair;static long []bit = new long[N];static bool []root_node = new bool[N];// bit : bit array// i and j are starting and// ending index INCLUSIVEstatic long bit_q(int i, int j){ long sum = 0; while (j > 0) { sum += bit[j]; j -= (j & (j * -1)); } i--; while (i > 0) { sum -= bit[i]; i -= (i & (i * -1)); } return sum;}// bit : bit array// n : size of bit array// i is the index to be updated// diff is (new_val - old_val)static void bit_up(int i, long diff){ while (i <= n) { bit[i] += diff; i += i & -i; }}// DFS function to find// ideal pairsstatic void dfs(int node){ Ideal_pair += bit_q(Math.Max(1, node - k), Math.Min(n, node + k)); bit_up(node, 1); for(int i = 0; i < al[node].Count; i++) dfs(al[node][i]); bit_up(node, -1);}// Function for// initialisationstatic void initalise(){ Ideal_pair = 0; for (int i = 0; i <= n; i++) { root_node[i] = true; bit[i] = 0; }}// Function to add an edgestatic void Add_Edge(int x, int y){ al[x].Add(y); root_node[y] = false;}// Function to find number// of ideal pairsstatic long Idealpairs(){ // Find root of the tree int r = -1; for(int i = 1; i <= n; i++) if (root_node[i]) { r = i; break; }
|