#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n, m, k, a, b; long long int wynik = 0; cin >> n >> m >> k; vector <pair <int, int> > Reakcje(k); vector <pair <int, int> > Zadania(m); vector <vector <int> > Fiolki(n); vector <int> Ilosci(n); for(int i=0; i<n; i++) { Fiolki[i].push_back(i); cin >> Ilosci[i]; } for(int i=0; i<m; i++) { cin >> Zadania[i].first >> Zadania[i].second; Zadania[i].first--, Zadania[i].second--; } for(int i=0; i<k; i++) { cin >> Reakcje[i].first >> Reakcje[i].second; Reakcje[i].first--, Reakcje[i].second--; } for(int i=0; i<m; i++) { a=Zadania[i].first, b=Zadania[i].second; // cout << "POSZUKIWANI: " << a << " i " << b <<endl; for(int j=0; j<k; j++) { // cout << "Szukam " << Reakcje[j].first << " i " << Reakcje[j].second << endl; // cout << "Tu sa " << Fiolki[a][lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].first)-Fiolki[a].begin()] << " i " << Fiolki[b][lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].second)-Fiolki[b].begin()] << endl; // cout << "Tu sa " << Fiolki[a][lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].second)-Fiolki[a].begin()] << " i " << Fiolki[b][lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].first)-Fiolki[b].begin()] << endl; if(Fiolki[a].size()>0 && Fiolki[b].size()>0){ if(Fiolki[a][lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].first)-Fiolki[a].begin()]==Reakcje[j].first && Fiolki[b][lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].second)-Fiolki[b].begin()]==Reakcje[j].second) { if(Ilosci[Reakcje[j].first]<Ilosci[Reakcje[j].second]) { wynik+=2*Ilosci[Reakcje[j].first]; Ilosci[Reakcje[j].second]=Ilosci[Reakcje[j].second]-Ilosci[Reakcje[j].first]; Fiolki[a].erase(lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].first)); } else { if(Ilosci[Reakcje[j].first]!=Ilosci[Reakcje[j].second]) { wynik+=2*Ilosci[Reakcje[j].second]; Ilosci[Reakcje[j].first]=Ilosci[Reakcje[j].first]-Ilosci[Reakcje[j].second]; Fiolki[b].erase(lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].second)); } else { wynik+=2*Ilosci[Reakcje[j].second]; Fiolki[b].erase(lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].second)); Fiolki[a].erase(lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].first)); } } } else { if(Fiolki[a][lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].second)-Fiolki[a].begin()]==Reakcje[j].second && Fiolki[b][lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].first)-Fiolki[b].begin()]==Reakcje[j].first) { if(Ilosci[Reakcje[j].first]<Ilosci[Reakcje[j].second]) { wynik+=2*Ilosci[Reakcje[j].first]; Ilosci[Reakcje[j].second]=Ilosci[Reakcje[j].second]-Ilosci[Reakcje[j].first]; Fiolki[b].erase(lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].first)); } else { if(Ilosci[Reakcje[j].first]!=Ilosci[Reakcje[j].second]) { wynik+=2*Ilosci[Reakcje[j].second]; Ilosci[Reakcje[j].first]=Ilosci[Reakcje[j].first]-Ilosci[Reakcje[j].second]; Fiolki[a].erase(lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].second)); } else { wynik+=2*Ilosci[Reakcje[j].second]; Fiolki[a].erase(lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].second)); Fiolki[b].erase(lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].first)); } } } }} } for(int x=0; x<Fiolki[a].size(); x++) { Fiolki[b].push_back(Fiolki[a][x]); } sort(Fiolki[b].begin(), Fiolki[b].end()); Fiolki[a].erase(Fiolki[a].begin(), Fiolki[a].end()); } cout << wynik; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n, m, k, a, b; long long int wynik = 0; cin >> n >> m >> k; vector <pair <int, int> > Reakcje(k); vector <pair <int, int> > Zadania(m); vector <vector <int> > Fiolki(n); vector <int> Ilosci(n); for(int i=0; i<n; i++) { Fiolki[i].push_back(i); cin >> Ilosci[i]; } for(int i=0; i<m; i++) { cin >> Zadania[i].first >> Zadania[i].second; Zadania[i].first--, Zadania[i].second--; } for(int i=0; i<k; i++) { cin >> Reakcje[i].first >> Reakcje[i].second; Reakcje[i].first--, Reakcje[i].second--; } for(int i=0; i<m; i++) { a=Zadania[i].first, b=Zadania[i].second; // cout << "POSZUKIWANI: " << a << " i " << b <<endl; for(int j=0; j<k; j++) { // cout << "Szukam " << Reakcje[j].first << " i " << Reakcje[j].second << endl; // cout << "Tu sa " << Fiolki[a][lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].first)-Fiolki[a].begin()] << " i " << Fiolki[b][lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].second)-Fiolki[b].begin()] << endl; // cout << "Tu sa " << Fiolki[a][lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].second)-Fiolki[a].begin()] << " i " << Fiolki[b][lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].first)-Fiolki[b].begin()] << endl; if(Fiolki[a].size()>0 && Fiolki[b].size()>0){ if(Fiolki[a][lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].first)-Fiolki[a].begin()]==Reakcje[j].first && Fiolki[b][lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].second)-Fiolki[b].begin()]==Reakcje[j].second) { if(Ilosci[Reakcje[j].first]<Ilosci[Reakcje[j].second]) { wynik+=2*Ilosci[Reakcje[j].first]; Ilosci[Reakcje[j].second]=Ilosci[Reakcje[j].second]-Ilosci[Reakcje[j].first]; Fiolki[a].erase(lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].first)); } else { if(Ilosci[Reakcje[j].first]!=Ilosci[Reakcje[j].second]) { wynik+=2*Ilosci[Reakcje[j].second]; Ilosci[Reakcje[j].first]=Ilosci[Reakcje[j].first]-Ilosci[Reakcje[j].second]; Fiolki[b].erase(lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].second)); } else { wynik+=2*Ilosci[Reakcje[j].second]; Fiolki[b].erase(lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].second)); Fiolki[a].erase(lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].first)); } } } else { if(Fiolki[a][lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].second)-Fiolki[a].begin()]==Reakcje[j].second && Fiolki[b][lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].first)-Fiolki[b].begin()]==Reakcje[j].first) { if(Ilosci[Reakcje[j].first]<Ilosci[Reakcje[j].second]) { wynik+=2*Ilosci[Reakcje[j].first]; Ilosci[Reakcje[j].second]=Ilosci[Reakcje[j].second]-Ilosci[Reakcje[j].first]; Fiolki[b].erase(lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].first)); } else { if(Ilosci[Reakcje[j].first]!=Ilosci[Reakcje[j].second]) { wynik+=2*Ilosci[Reakcje[j].second]; Ilosci[Reakcje[j].first]=Ilosci[Reakcje[j].first]-Ilosci[Reakcje[j].second]; Fiolki[a].erase(lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].second)); } else { wynik+=2*Ilosci[Reakcje[j].second]; Fiolki[a].erase(lower_bound(Fiolki[a].begin(), Fiolki[a].end(), Reakcje[j].second)); Fiolki[b].erase(lower_bound(Fiolki[b].begin(), Fiolki[b].end(), Reakcje[j].first)); } } } }} } for(int x=0; x<Fiolki[a].size(); x++) { Fiolki[b].push_back(Fiolki[a][x]); } sort(Fiolki[b].begin(), Fiolki[b].end()); Fiolki[a].erase(Fiolki[a].begin(), Fiolki[a].end()); } cout << wynik; return 0; } |