Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. #define pb(a) push_back(a)
  5.  
  6. using namespace std;
  7.  
  8. long long akt[1000000+5];
  9. long long doce[1000000+5];
  10. long long D[1000000+5];
  11.  
  12. vector<int>sas[1000000+5];
  13. vector<int>synowie[1000000+5];
  14. int father[1000000+5];
  15. bool odw[1000000+5];
  16. long long koszt_pod[1000000+5];
  17. long long akt_nadmiar[1000000+5];
  18. long long do_przek_synom[1000000+5];
  19. long long cost = 0;
  20.  
  21. void DFS_MT(int w)
  22. {
  23.     odw[w] = 1;
  24.     for(int i=0; i<sas[w].size(); i++)
  25.         if(!odw[sas[w][i]])
  26.         {
  27.             synowie[w].pb(sas[w][i]);
  28.             father[sas[w][i]] = w;
  29.             DFS_MT(sas[w][i]);
  30.         }
  31. }
  32.  
  33. void DFS_MCOST(int w)
  34. {
  35.     for(int i=0; i<synowie[w].size(); i++) 
  36.         DFS_MCOST(synowie[w][i]);
  37.    
  38.     long long tmp = 1;
  39.     for(int i=0; i<synowie[w].size(); i++)
  40.         tmp += koszt_pod[synowie[w][i]];
  41.     koszt_pod[w] = tmp;
  42. }
  43.  
  44. void DFS_MAKE_NADMIAR(int w)
  45. {      
  46.     for(int i=0; i<synowie[w].size(); i++) 
  47.         DFS_MAKE_NADMIAR(synowie[w][i]);
  48.    
  49.     akt_nadmiar[w] = D[w];
  50.     for(int i=0; i<synowie[w].size(); i++) 
  51.         akt_nadmiar[w] += akt_nadmiar[synowie[w][i]];
  52.  
  53. }
  54.  
  55. void DFS_MAKE_DODATNIE(int w)
  56. {
  57.     for(int i=0; i<synowie[w].size(); i++)
  58.         DFS_MAKE_DODATNIE(synowie[w][i]);
  59.    
  60.     long long max_dlug = 0;
  61.     for(int i=0; i<synowie[w].size(); i++)
  62.         max_dlug = min(max_dlug, akt_nadmiar[synowie[w][i]]);
  63.    
  64.     if(max_dlug < 0)
  65.     {
  66.         max_dlug *= (-1);
  67.         cost += max_dlug;
  68.         if(father[w] != w)
  69.             akt_nadmiar[w] -= max_dlug; ///tyle co przekazalem ojcu - "ucieklo" z mojego poddrzewa
  70.         for(int i=0; i<synowie[w].size(); i++)
  71.             akt_nadmiar[synowie[w][i]] += max_dlug;
  72.     }      
  73. }
  74.  
  75. void DFS_MAKE_ZERO(int w)
  76. {
  77.     for(int i=0; i<synowie[w].size(); i++)
  78.         DFS_MAKE_ZERO(synowie[w][i]);
  79.  
  80.     if(akt_nadmiar[w])
  81.         cost += akt_nadmiar[w] * koszt_pod[w];
  82. }
  83.  
  84. int main()
  85. {
  86.     ios_base::sync_with_stdio(0);
  87.     cin.tie(0);
  88.     cout.tie(0);
  89.     long long n;
  90.     cin>>n;
  91.  
  92.     for(int i=1; i<=n; i++)
  93.         cin>>akt[i];
  94.     for(int i=1; i<=n; i++)
  95.         cin>>doce[i];
  96.  
  97.     for(int i=1; i<=n; i++)
  98.         D[i] = akt[i] - doce[i];
  99.  
  100.     long long tmp1, tmp2;
  101.     for(int i=1; i<n; i++)
  102.     {
  103.         cin>>tmp1>>tmp2;
  104.         sas[tmp1].pb(tmp2);
  105.         sas[tmp2].pb(tmp1);
  106.     }
  107.  
  108.     father[1] = 1;
  109.     DFS_MT(1);
  110.  
  111.     DFS_MCOST(1);
  112.     DFS_MAKE_NADMIAR(1);
  113.     if(akt_nadmiar[1] != 0)
  114.     {
  115.         cout<<"NIE";
  116.         return 0;
  117.     }
  118.  
  119.     else
  120.         cout<<"TAK"<<endl;
  121.  
  122.     DFS_MAKE_DODATNIE(1);
  123.     DFS_MAKE_ZERO(1);
  124.  
  125.     cout<<cost;
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement