Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. class Element {
  7. public:
  8. int wart;
  9. Element *lewy, *prawy;
  10. Element(int v) {
  11. wart = v;
  12. lewy = nullptr;
  13. prawy = nullptr;
  14. }
  15. };
  16.  
  17. class Tree {
  18. public:
  19. Element* root;
  20. int licznik = 0;
  21. Tree() {
  22. root = new Element(0);
  23. }
  24. void insertTree(Element *e, int *tab, int liczba, int rozmiartablicy)
  25. {
  26. int lewy = 2 * liczba + 1;
  27. int prawy = 2 * liczba + 2;
  28.  
  29. if (lewy > rozmiartablicy || prawy > rozmiartablicy) return;
  30.  
  31. if (e == nullptr)
  32. {
  33. Element *elem = new Element(tab[liczba]);
  34. e = elem;
  35. }
  36.  
  37. if (e->lewy == nullptr && e->prawy == nullptr) {
  38. if (lewy < rozmiartablicy)
  39. {
  40. Element *elem = new Element(tab[lewy]);
  41. e->lewy = elem;
  42. }
  43. if (prawy < rozmiartablicy)
  44. {
  45. Element *elem = new Element(tab[prawy]);
  46. e->prawy = elem;
  47. }
  48. }
  49. insertTree(e->lewy, tab, lewy, rozmiartablicy);
  50. insertTree(e->prawy, tab, prawy, rozmiartablicy);
  51.  
  52. }
  53.  
  54. vector <int> fun(Element *aktualny, vector<int> sciezka, int k)
  55. {
  56. int suma = 0;
  57. vector<int> sciezkaL, sciezkaP;
  58.  
  59. if (aktualny->prawy != nullptr) { sciezkaP = fun(aktualny->prawy, sciezkaP, k); }
  60. if (aktualny->lewy != nullptr) { sciezkaL = fun(aktualny->lewy, sciezkaL, k); }
  61.  
  62. if (aktualny->wart == k) licznik++;
  63.  
  64. if (aktualny != root)sciezka.push_back(aktualny->wart);
  65.  
  66. if (aktualny->prawy == nullptr && aktualny->lewy == nullptr) return sciezka;
  67.  
  68. for (int i = 0; i < sciezkaL.size(); i++)
  69. {
  70. for (int j = 0; j < sciezkaP.size(); j++)
  71. {
  72. suma = sciezkaL[i] + sciezkaP[j];
  73. if (suma == k) licznik++;
  74. }
  75. }
  76.  
  77. sciezka.insert(sciezka.begin(), sciezkaP.begin(), sciezkaP.end());
  78. sciezka.insert(sciezka.begin(), sciezkaL.begin(), sciezkaL.end());
  79.  
  80.  
  81. if (aktualny != root)
  82. {
  83. for (int i = 0; i < sciezka.size() - 1; i++)
  84. {
  85. sciezka[i] += aktualny->wart;
  86. if (sciezka[i] == k) licznik++;
  87. if (sciezka[i] >= k)
  88. {
  89. sciezka.erase(sciezka.begin() + i);
  90. i = i - 1;
  91. }
  92. }
  93. }
  94.  
  95.  
  96. return sciezka;
  97.  
  98. }
  99.  
  100. };
  101.  
  102. int main()
  103. {
  104. int t, n, k, liczba;
  105. vector<int> sciezka;
  106. cin >> t;
  107. int *tab;
  108.  
  109. for (int i = 0; i < t; i++)
  110. {
  111. Tree tree;
  112. cin >> n >> k;
  113. tab = new int[n + 1];
  114. tab[0] = 0;
  115.  
  116. for (int j = 1; j < n + 1; j++)
  117. {
  118. cin >> liczba;
  119. tab[j] = liczba;
  120. }
  121. tree.insertTree(tree.root, tab, 0, n + 1);
  122. tree.fun(tree.root, sciezka, k);
  123. cout << tree.licznik << endl;
  124. }
  125.  
  126. return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement