Advertisement
Guest User

Untitled

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