Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
/// wykorzystane zadanie komiwoja�er z 9. oi #include <iostream> #include <cstdio> #include <vector> #include <cmath> #include<algorithm> #define maxN 200005 #define maxO 500005 using namespace std; int currTree, Tin[maxN], Tout[maxN], Depth[maxN], D[20][maxN], mxd=0, tim, fiol[maxN], tab[maxN], pary[2][maxN], tree[maxN]; bool vst[maxN]; vector <int> G[maxN]; vector< pair< int, pair<int, int> > > osad; void dfs (int a) { vst[a]=1; tree[a] = currTree; tim++; Tin[a]=tim; for (int i=0; i<G[a].size(); i++) if (Depth [G[a][i]]==0) { Depth [G[a][i]]=Depth[a]+1; mxd=max(mxd, Depth [G[a][i]]); D[0][G[a][i]]=a; dfs(G[a][i]); } Tout[a]=tim; } bool potomek (int a, int b) { return (Tin[a]<=Tin[b] && Tout[a]>=Tout[b]); } bool cmp(pair<int, pair<int, int> > a,pair<int, pair<int, int> > b ){ return (a.first > b.first ); } int LCA (int a, int b) { if (potomek (a,b)) return a; else if (potomek (b, a) ) return b; int i=a, j = mxd; while(j>=0){ if(potomek(b, D[j][i])) j--; else i=D[j][i]; } return D[0][i]; } int main () { int n, m, k; scanf ("%d%d%d", &n, &m, &k); for(int i=1; i<=n; ++i){ scanf("%d", &fiol[i]); tab[i]=i; } for (int i=0; i<m; i++) { int a, b; scanf ("%d%d", &a, &b); pary[0][i] = a; pary[1][i] = b; G[a].push_back(b); G[b].push_back(a); } int wsk=1; for(int i=m-1; i>=0; i--) for(int j=1; j>=0; j--) if(vst[pary[j][i]]==0) { // printf(" - %d \n", pary[j][i] ); currTree = pary[j][i]; Depth[pary[j][i]] = 1; tree[pary[j][i]]=wsk; wsk++; dfs(pary[j][i]); D[0][pary[j][i]]=1; } double o=log2(mxd); mxd=o+1; // printf("%d\n", mxd); for (int p=0; p<=mxd; p++) for (int u=1; u<=n; u++) D[p+1][u] = D[p][D[p][u]]; for(int i=0; i<k; ++i) { int a, b; scanf ("%d%d", &a, &b); osad.push_back(make_pair(Depth[LCA(a, b)], make_pair(a, b))); } sort(osad.begin(), osad.end(), cmp); long long res = 0LL; for(int i=0; i<k; ++i){ int a, b; a = osad[i].second.first; b = osad[i].second.second; if(tree[a] == tree[b]){ int minn = min(fiol[a], fiol[b]); fiol[a] -= minn; fiol[b] -= minn; res += (long long) minn *2; } } 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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | /// wykorzystane zadanie komiwoja�er z 9. oi #include <iostream> #include <cstdio> #include <vector> #include <cmath> #include<algorithm> #define maxN 200005 #define maxO 500005 using namespace std; int currTree, Tin[maxN], Tout[maxN], Depth[maxN], D[20][maxN], mxd=0, tim, fiol[maxN], tab[maxN], pary[2][maxN], tree[maxN]; bool vst[maxN]; vector <int> G[maxN]; vector< pair< int, pair<int, int> > > osad; void dfs (int a) { vst[a]=1; tree[a] = currTree; tim++; Tin[a]=tim; for (int i=0; i<G[a].size(); i++) if (Depth [G[a][i]]==0) { Depth [G[a][i]]=Depth[a]+1; mxd=max(mxd, Depth [G[a][i]]); D[0][G[a][i]]=a; dfs(G[a][i]); } Tout[a]=tim; } bool potomek (int a, int b) { return (Tin[a]<=Tin[b] && Tout[a]>=Tout[b]); } bool cmp(pair<int, pair<int, int> > a,pair<int, pair<int, int> > b ){ return (a.first > b.first ); } int LCA (int a, int b) { if (potomek (a,b)) return a; else if (potomek (b, a) ) return b; int i=a, j = mxd; while(j>=0){ if(potomek(b, D[j][i])) j--; else i=D[j][i]; } return D[0][i]; } int main () { int n, m, k; scanf ("%d%d%d", &n, &m, &k); for(int i=1; i<=n; ++i){ scanf("%d", &fiol[i]); tab[i]=i; } for (int i=0; i<m; i++) { int a, b; scanf ("%d%d", &a, &b); pary[0][i] = a; pary[1][i] = b; G[a].push_back(b); G[b].push_back(a); } int wsk=1; for(int i=m-1; i>=0; i--) for(int j=1; j>=0; j--) if(vst[pary[j][i]]==0) { // printf(" - %d \n", pary[j][i] ); currTree = pary[j][i]; Depth[pary[j][i]] = 1; tree[pary[j][i]]=wsk; wsk++; dfs(pary[j][i]); D[0][pary[j][i]]=1; } double o=log2(mxd); mxd=o+1; // printf("%d\n", mxd); for (int p=0; p<=mxd; p++) for (int u=1; u<=n; u++) D[p+1][u] = D[p][D[p][u]]; for(int i=0; i<k; ++i) { int a, b; scanf ("%d%d", &a, &b); osad.push_back(make_pair(Depth[LCA(a, b)], make_pair(a, b))); } sort(osad.begin(), osad.end(), cmp); long long res = 0LL; for(int i=0; i<k; ++i){ int a, b; a = osad[i].second.first; b = osad[i].second.second; if(tree[a] == tree[b]){ int minn = min(fiol[a], fiol[b]); fiol[a] -= minn; fiol[b] -= minn; res += (long long) minn *2; } } printf("%lld", res); return 0; } |