Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #define pb(a) push_back(a)
- using namespace std;
- long long akt[1000000+5];
- long long doce[1000000+5];
- long long D[1000000+5];
- vector<int>sas[1000000+5];
- vector<int>synowie[1000000+5];
- int father[1000000+5];
- bool odw[1000000+5];
- long long koszt_pod[1000000+5];
- long long akt_nadmiar[1000000+5];
- long long do_przek_synom[1000000+5];
- long long cost = 0;
- void DFS_MT(int w)
- {
- odw[w] = 1;
- for(int i=0; i<sas[w].size(); i++)
- if(!odw[sas[w][i]])
- {
- synowie[w].pb(sas[w][i]);
- father[sas[w][i]] = w;
- DFS_MT(sas[w][i]);
- }
- }
- void DFS_MCOST(int w)
- {
- for(int i=0; i<synowie[w].size(); i++)
- DFS_MCOST(synowie[w][i]);
- long long tmp = 1;
- for(int i=0; i<synowie[w].size(); i++)
- tmp += koszt_pod[synowie[w][i]];
- koszt_pod[w] = tmp;
- }
- void DFS_MAKE_NADMIAR(int w)
- {
- for(int i=0; i<synowie[w].size(); i++)
- DFS_MAKE_NADMIAR(synowie[w][i]);
- akt_nadmiar[w] = D[w];
- for(int i=0; i<synowie[w].size(); i++)
- akt_nadmiar[w] += akt_nadmiar[synowie[w][i]];
- }
- void DFS_MAKE_DODATNIE(int w)
- {
- for(int i=0; i<synowie[w].size(); i++)
- DFS_MAKE_DODATNIE(synowie[w][i]);
- long long max_dlug = 0;
- for(int i=0; i<synowie[w].size(); i++)
- max_dlug = min(max_dlug, akt_nadmiar[synowie[w][i]]);
- if(max_dlug < 0)
- {
- max_dlug *= (-1);
- cost += max_dlug;
- if(father[w] != w)
- akt_nadmiar[w] -= max_dlug; ///tyle co przekazalem ojcu - "ucieklo" z mojego poddrzewa
- for(int i=0; i<synowie[w].size(); i++)
- akt_nadmiar[synowie[w][i]] += max_dlug;
- }
- }
- void DFS_MAKE_ZERO(int w)
- {
- for(int i=0; i<synowie[w].size(); i++)
- DFS_MAKE_ZERO(synowie[w][i]);
- if(akt_nadmiar[w])
- cost += akt_nadmiar[w] * koszt_pod[w];
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- long long n;
- cin>>n;
- for(int i=1; i<=n; i++)
- cin>>akt[i];
- for(int i=1; i<=n; i++)
- cin>>doce[i];
- for(int i=1; i<=n; i++)
- D[i] = akt[i] - doce[i];
- long long tmp1, tmp2;
- for(int i=1; i<n; i++)
- {
- cin>>tmp1>>tmp2;
- sas[tmp1].pb(tmp2);
- sas[tmp2].pb(tmp1);
- }
- father[1] = 1;
- DFS_MT(1);
- DFS_MCOST(1);
- DFS_MAKE_NADMIAR(1);
- if(akt_nadmiar[1] != 0)
- {
- cout<<"NIE";
- return 0;
- }
- else
- cout<<"TAK"<<endl;
- DFS_MAKE_DODATNIE(1);
- DFS_MAKE_ZERO(1);
- cout<<cost;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement