/// O(n*m*k)
#include <iostream>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define REP(x,n) for(int x=0;x<(n);++x)
#define FOR(a,b,e) for(int a=b;a<=(e);++a)
#define VAR(x,n) __typeof(n) x = (n)
#define FOREACH(x,n) for(VAR(x,(n).begin());x!=(n).end();++x)
int n,m,k;
typedef pair<int,int> PII;
const int MAX_N = 200001;
vector<int> reagenty[MAX_N];
int masy[MAX_N];
PII kroki[MAX_N];
int fiolki[2][MAX_N];
int main() {
ios_base::sync_with_stdio(0);
cin>>n>>m>>k;
REP(x,n)
cin>>masy[x];
REP(x,m) {
cin>>kroki[x].first>>kroki[x].second;
--kroki[x].first;
--kroki[x].second;
}
int a,b;
REP(x,k) {
cin>>a>>b;
reagenty[--a].push_back(--b);
reagenty[b].push_back(a);
}
REP(x,n)
fiolki[0][x] = x;
long long suma=0;
int reag;
/// ///////////////////////////////////////// REP(x,m) {
REP(x,10000) {
REP(y,n)
if (kroki[x].first==fiolki[x&1][y]) {
fiolki[~x&1][y] = kroki[x].second;
if (masy[y])
FOREACH(it, reagenty[y]) {
if (fiolki[x&1][*it] == kroki[x].second) {
suma += 2*(reag = min(masy[y], masy[*it]));
masy[y] -= reag;
masy[*it] -= reag;
}
}
} else
fiolki[~x&1][y] = fiolki[x&1][y];
}
cout << suma << 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 | /// O(n*m*k) #include <iostream> #include <map> #include <set> #include <vector> using namespace std; #define REP(x,n) for(int x=0;x<(n);++x) #define FOR(a,b,e) for(int a=b;a<=(e);++a) #define VAR(x,n) __typeof(n) x = (n) #define FOREACH(x,n) for(VAR(x,(n).begin());x!=(n).end();++x) int n,m,k; typedef pair<int,int> PII; const int MAX_N = 200001; vector<int> reagenty[MAX_N]; int masy[MAX_N]; PII kroki[MAX_N]; int fiolki[2][MAX_N]; int main() { ios_base::sync_with_stdio(0); cin>>n>>m>>k; REP(x,n) cin>>masy[x]; REP(x,m) { cin>>kroki[x].first>>kroki[x].second; --kroki[x].first; --kroki[x].second; } int a,b; REP(x,k) { cin>>a>>b; reagenty[--a].push_back(--b); reagenty[b].push_back(a); } REP(x,n) fiolki[0][x] = x; long long suma=0; int reag; /// ///////////////////////////////////////// REP(x,m) { REP(x,10000) { REP(y,n) if (kroki[x].first==fiolki[x&1][y]) { fiolki[~x&1][y] = kroki[x].second; if (masy[y]) FOREACH(it, reagenty[y]) { if (fiolki[x&1][*it] == kroki[x].second) { suma += 2*(reag = min(masy[y], masy[*it])); masy[y] -= reag; masy[*it] -= reag; } } } else fiolki[~x&1][y] = fiolki[x&1][y]; } cout << suma << endl; return 0; } |
English