#include<iostream> #include <algorithm> #include <stdlib.h> #include<set> using namespace std; #define M2 200002 #define M5 500005 struct CzegoIle { int czego; int ile;}; bool Por(const CzegoIle& a1, const CzegoIle& a2) { return a1.czego<a2.czego;}; typedef set<CzegoIle,bool(*)(const CzegoIle&, const CzegoIle&)>::iterator iter; set<CzegoIle,bool(*)(const CzegoIle&, const CzegoIle&)> W[M2]; struct React { int first; int second; int which;}; bool CheckIf(const React& a1, const React& a2) { if(a1.first!=a2.first) return a1.first<a2.first; else return a1.second<a2.second; }; typedef set<React,bool(*)(const React&, const React&)>::iterator kukaj; set<React, bool(*)(const React&,const React&)> re(&CheckIf); int main( ) { set<int> jjj; set<int>::iterator it; // ios_base::sync_with_stdio(0); int masy, kroki, pary, tempy, k; long long wynik=0; int ZE[M2], DO[M2], PA[M5], RA[M5]; for(int i=0; i<M2; ++i) W[i]=set<CzegoIle,bool(*)(const CzegoIle&, const CzegoIle&)> (&Por); /*W[i] tablica zbiorów par*/ CzegoIle Temp1, Temp2; React temp; iter it1, it2; kukaj ttt; cin >> masy >> kroki >> pary; for(int j=1; j<=masy; ++j) { Temp1.czego=j; cin >> Temp1.ile; /*masa subst. "j" we fiolce "j"*/ W[j].insert(Temp1); } for(int i=1; i<=kroki; ++i) cin>>ZE[i]>>DO[i]; /*kolejne przelewy*/ for(int k=1; k<=pary; ++k){ cin >> PA[k] >> RA[k]; /*pary reagujące ze sobą (od max)*/ temp.first=min(PA[k],RA[k]); temp.second=max(PA[k],RA[k]); temp.which=k; re.insert(temp); temp.first=max(PA[k],RA[k]); temp.second=min(PA[k],RA[k]); temp.which=k; re.insert(temp); } for(int i=1; i<=kroki; ++i) { for (it1=W[ZE[i]].begin(); it1!=W[ZE[i]].end(); ++it1) W[DO[i]].insert(*it1); for (it1=W[DO[i]].begin(); it1!=W[DO[i]].end(); ++it1) { for (it2=it1; it2!=W[DO[i]].end(); ++it2) { temp.first=(*it1).czego; temp.second=(*it2).czego; ttt=re.find(temp); if(ttt != re.end()) { jjj.insert((*ttt).which); } } } for(it = jjj.begin(); it!=jjj.end(); ++it){ k = *it; Temp1.czego=PA[k]; Temp2.czego=RA[k]; it1 = W[DO[i]].find(Temp1); it2 = W[DO[i]].find(Temp2); if( (it1 != W[DO[i]].end()) && (it2 != W[DO[i]].end()) ) { wynik+=(min( (*it1).ile , (*it2).ile ))*2; if((*it1).ile>(*it2).ile) { Temp1.czego=(*it1).czego; Temp1.ile=(*it1).ile-(*it2).ile; } else { Temp1.czego=(*it2).czego; Temp1.ile=(*it2).ile-(*it1).ile; } W[DO[i]].erase(*it2); W[DO[i]].erase(*it1); if(Temp1.ile) W[DO[i]].insert(Temp1); } } } cout<<wynik<<endl; 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 | #include<iostream> #include <algorithm> #include <stdlib.h> #include<set> using namespace std; #define M2 200002 #define M5 500005 struct CzegoIle { int czego; int ile;}; bool Por(const CzegoIle& a1, const CzegoIle& a2) { return a1.czego<a2.czego;}; typedef set<CzegoIle,bool(*)(const CzegoIle&, const CzegoIle&)>::iterator iter; set<CzegoIle,bool(*)(const CzegoIle&, const CzegoIle&)> W[M2]; struct React { int first; int second; int which;}; bool CheckIf(const React& a1, const React& a2) { if(a1.first!=a2.first) return a1.first<a2.first; else return a1.second<a2.second; }; typedef set<React,bool(*)(const React&, const React&)>::iterator kukaj; set<React, bool(*)(const React&,const React&)> re(&CheckIf); int main( ) { set<int> jjj; set<int>::iterator it; // ios_base::sync_with_stdio(0); int masy, kroki, pary, tempy, k; long long wynik=0; int ZE[M2], DO[M2], PA[M5], RA[M5]; for(int i=0; i<M2; ++i) W[i]=set<CzegoIle,bool(*)(const CzegoIle&, const CzegoIle&)> (&Por); /*W[i] tablica zbiorów par*/ CzegoIle Temp1, Temp2; React temp; iter it1, it2; kukaj ttt; cin >> masy >> kroki >> pary; for(int j=1; j<=masy; ++j) { Temp1.czego=j; cin >> Temp1.ile; /*masa subst. "j" we fiolce "j"*/ W[j].insert(Temp1); } for(int i=1; i<=kroki; ++i) cin>>ZE[i]>>DO[i]; /*kolejne przelewy*/ for(int k=1; k<=pary; ++k){ cin >> PA[k] >> RA[k]; /*pary reagujące ze sobą (od max)*/ temp.first=min(PA[k],RA[k]); temp.second=max(PA[k],RA[k]); temp.which=k; re.insert(temp); temp.first=max(PA[k],RA[k]); temp.second=min(PA[k],RA[k]); temp.which=k; re.insert(temp); } for(int i=1; i<=kroki; ++i) { for (it1=W[ZE[i]].begin(); it1!=W[ZE[i]].end(); ++it1) W[DO[i]].insert(*it1); for (it1=W[DO[i]].begin(); it1!=W[DO[i]].end(); ++it1) { for (it2=it1; it2!=W[DO[i]].end(); ++it2) { temp.first=(*it1).czego; temp.second=(*it2).czego; ttt=re.find(temp); if(ttt != re.end()) { jjj.insert((*ttt).which); } } } for(it = jjj.begin(); it!=jjj.end(); ++it){ k = *it; Temp1.czego=PA[k]; Temp2.czego=RA[k]; it1 = W[DO[i]].find(Temp1); it2 = W[DO[i]].find(Temp2); if( (it1 != W[DO[i]].end()) && (it2 != W[DO[i]].end()) ) { wynik+=(min( (*it1).ile , (*it2).ile ))*2; if((*it1).ile>(*it2).ile) { Temp1.czego=(*it1).czego; Temp1.ile=(*it1).ile-(*it2).ile; } else { Temp1.czego=(*it2).czego; Temp1.ile=(*it2).ile-(*it1).ile; } W[DO[i]].erase(*it2); W[DO[i]].erase(*it1); if(Temp1.ile) W[DO[i]].insert(Temp1); } } } cout<<wynik<<endl; return 0; } |