Submission #1292009

#TimeUsernameProblemLanguageResultExecution timeMemory
1292009dostsToll (APIO13_toll)C++20
16 / 100
2 ms1088 KiB
#include <bits/stdc++.h> #ifdef Dodi #include "/home/dodi/Desktop/ATC/ARC/arc156/debug.h" #else #define debug(...) void(42) #endif #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") #define int long long #define pii pair<int,int> #define vi vector<int> #define ff first #define ss second #define sp << " " << #define all(x) x.begin(),x.end() #define big(x) ((int)(x.size())) using namespace std; const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18; const int N = 1e5+1; struct DSU { vi dad,sz; int n; DSU(int nn) { n = nn; dad.resize(nn+1); sz.assign(nn+1,1); iota(all(dad),0ll); } int find(int x) { if (x == dad[x]) return x; return dad[x] = find(dad[x]); } void unite(int x,int y) { int a = find(x),b = find(y); if (a == b) return; if (sz[a] > sz[b]) swap(a,b); sz[b]+=sz[a]; dad[a] = b; } void reset() { iota(all(dad),0ll); sz.assign(n+1,1); } }; vector<pii> final[N]; vi people(N,0); pii dfs(int node,int p) { int ans = 0,many = people[node]; for (auto it : final[node]){ if (it.ff == p) continue; pii pr = dfs(it.ff,node); ans+=it.ss*pr.ss; ans+=pr.ff; many+=pr.ss; } return {ans,many}; } void solve() { int n,m,k; cin >> n >> m >> k; vector<pair<int,pii>> edges; vector<pii> my_edges; vi value(k); for (int i=1;i<=m;i++) { int a,b,c; cin >> a >> b >> c; edges.push_back({c,{a,b}}); } for (int i=1;i<=k;i++) { int a,b; cin >> a >> b; my_edges.push_back({a,b}); } vi vals(n+1); for (int i=1;i<=n;i++) cin >> vals[i]; sort(all(edges)); DSU dsu(n),dsu2(n); for (auto [cost,con] : edges) { auto [a,b] = con; if (dsu.find(a) == dsu.find(b)) continue; int fl = 0; int ctr = -1; for (auto it : my_edges) { ++ctr; if (dsu.find(it.ff) == dsu.find(it.ss)) continue; int u = dsu.find(it.ff), v = dsu.find(it.ss); if (set<int>{dsu.find(a),dsu.find(b)} == set<int>{u,v}) { value[ctr] = cost; if (!fl) dsu.unite(a,b); fl = 1; } } if (!fl) dsu2.unite(a,b),dsu.unite(a,b); } vi roots; for (int i=1;i<=n;i++) roots.push_back(dsu2.find(i)); sort(all(roots)); roots.erase(unique(all(roots)),roots.end()); vi id(n+1); for (int i=1;i<=n;i++) { id[i] = upper_bound(all(roots),dsu2.find(i))-roots.begin(); people[id[i]]+=vals[i]; } DSU dsu3(big(roots)); int lim = (1<<k); int ans = 0; for (int i = 0;i<lim;i++) { dsu3.reset(); for (int j = 1;j<=big(roots);j++) final[j].clear(); for (int j = 0;j<k;j++) { if (!(i&(1<<j))) continue; if (dsu3.find(id[my_edges[j].ff]) != dsu3.find(id[my_edges[j].ss])) { final[id[my_edges[j].ff]].push_back({id[my_edges[j].ss],value[j]}); final[id[my_edges[j].ss]].push_back({id[my_edges[j].ff],value[j]}); dsu3.unite(id[my_edges[j].ff],id[my_edges[j].ss]); } } if (dsu3.sz[dsu3.find(1)] != big(roots)) continue; ans = max(ans,dfs(id[1],id[1]).ff); } cout << ans << '\n'; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); #ifdef Dodi freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif int t = 1; //cin >> t; while (t --> 0) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...