#include<stdio.h> #include<iostream> #include<stdlib.h> #include<vector> #include<list> #include<math.h> #include<algorithm> #include<string> #include<set> #include<queue> #define limit 200015 #define inf 9223372036854775807ll #define iinf 2147483647 #define mp make_pair #define pb push_back #define rep(i,k,n) for(int i=k;i<n;i++) using namespace std; int amount[limit],out[limit],num[limit]; long long res=0; vector<vector<int> > chi(limit); vector<vector<pair<int,int> > > ans(2000000); vector<vector<set<pair<int,pair<int,int> > > > > reacts(limit); vector<int> code; vector<int> code1; vector<vector<int> > apps(limit); void dfs(int v,int lvl){ ans[code.size()].pb(mp(lvl,v)); code.pb(lvl); apps[v].pb(code1.size()); code1.pb(v); rep(i,0,chi[v].size()){ dfs(chi[v][i],lvl+1); ans[code.size()].pb(mp(lvl,v)); code.pb(lvl); code1.pb(v); } } void dfs1(int v){ rep(i,0,chi[v].size()){ dfs1(chi[v][i]); if(v) for(set<pair<int,pair<int,int> > >::iterator it=reacts[v][i].begin();it!=reacts[v][i].end();it++){ int react=min(amount[(*it).second.first],amount[(*it).second.second]); res+=2*react; amount[(*it).second.first]-=react; amount[(*it).second.second]-=react; } } } int main(){ int n,m,k,temp1,temp2,temp3,temp4; scanf("%d%d%d",&n,&m,&k); rep(i,1,n+1) scanf("%d",&amount[i]); rep(i,0,m){ scanf("%d%d",&temp1,&temp2); out[temp1]++; num[temp1]=chi[temp2].size(); chi[temp2].pb(temp1); } rep(i,1,n+1) if(!out[i]) chi[0].pb(i); rep(i,0,n+1) reacts[i].resize(chi[i].size()); dfs(0,0); for(int j=1;j<code.size();j*=2) for(int k=0;k+2*j-1<code.size();k++) ans[k].pb(min(ans[k].back(),ans[k+j].back())); rep(i,1,k+1){ scanf("%d%d",&temp3,&temp4); temp1=apps[temp3].back(); temp2=apps[temp4].back(); if(temp1>temp2) swap(temp1,temp2); int d=int(log2(temp2-temp1)),lca; if(ans[temp1][d].first<ans[temp2-int(pow(2,d))][d].first) lca=ans[temp1][d].second; else lca=ans[temp2-int(pow(2,d))][d].second; vector<int>::iterator it=lower_bound(apps[lca].begin(),apps[lca].end(),temp2); --it; reacts[lca][num[code1[(*it)+1]]].insert(mp(i,mp(temp3,temp4))); } dfs1(0); printf("%lld",res); 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 | #include<stdio.h> #include<iostream> #include<stdlib.h> #include<vector> #include<list> #include<math.h> #include<algorithm> #include<string> #include<set> #include<queue> #define limit 200015 #define inf 9223372036854775807ll #define iinf 2147483647 #define mp make_pair #define pb push_back #define rep(i,k,n) for(int i=k;i<n;i++) using namespace std; int amount[limit],out[limit],num[limit]; long long res=0; vector<vector<int> > chi(limit); vector<vector<pair<int,int> > > ans(2000000); vector<vector<set<pair<int,pair<int,int> > > > > reacts(limit); vector<int> code; vector<int> code1; vector<vector<int> > apps(limit); void dfs(int v,int lvl){ ans[code.size()].pb(mp(lvl,v)); code.pb(lvl); apps[v].pb(code1.size()); code1.pb(v); rep(i,0,chi[v].size()){ dfs(chi[v][i],lvl+1); ans[code.size()].pb(mp(lvl,v)); code.pb(lvl); code1.pb(v); } } void dfs1(int v){ rep(i,0,chi[v].size()){ dfs1(chi[v][i]); if(v) for(set<pair<int,pair<int,int> > >::iterator it=reacts[v][i].begin();it!=reacts[v][i].end();it++){ int react=min(amount[(*it).second.first],amount[(*it).second.second]); res+=2*react; amount[(*it).second.first]-=react; amount[(*it).second.second]-=react; } } } int main(){ int n,m,k,temp1,temp2,temp3,temp4; scanf("%d%d%d",&n,&m,&k); rep(i,1,n+1) scanf("%d",&amount[i]); rep(i,0,m){ scanf("%d%d",&temp1,&temp2); out[temp1]++; num[temp1]=chi[temp2].size(); chi[temp2].pb(temp1); } rep(i,1,n+1) if(!out[i]) chi[0].pb(i); rep(i,0,n+1) reacts[i].resize(chi[i].size()); dfs(0,0); for(int j=1;j<code.size();j*=2) for(int k=0;k+2*j-1<code.size();k++) ans[k].pb(min(ans[k].back(),ans[k+j].back())); rep(i,1,k+1){ scanf("%d%d",&temp3,&temp4); temp1=apps[temp3].back(); temp2=apps[temp4].back(); if(temp1>temp2) swap(temp1,temp2); int d=int(log2(temp2-temp1)),lca; if(ans[temp1][d].first<ans[temp2-int(pow(2,d))][d].first) lca=ans[temp1][d].second; else lca=ans[temp2-int(pow(2,d))][d].second; vector<int>::iterator it=lower_bound(apps[lca].begin(),apps[lca].end(),temp2); --it; reacts[lca][num[code1[(*it)+1]]].insert(mp(i,mp(temp3,temp4))); } dfs1(0); printf("%lld",res); return 0; } |