# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
1095943 |
2024-10-03T12:21:26 Z |
lighton |
Toll (APIO13_toll) |
C++17 |
|
1252 ms |
25604 KB |
#include<bits/stdc++.h>
#define pb push_back
#define all(v) v.begin(),v.end()
#define forf(i,s,e) for(int i = s; i<=e; i++)
#define forb(i,s,e) for(int i = s; i>=e; i--)
#define idx(i,v) lower_bound(all(v),i)-v.begin()
#define comp(v) v.erase(unique(all(v)),v.end())
#define sz(v) (int)v.size()
#define fs first
#define se second
#define SP << " " <<
#define LN << "\n"
#define IO cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false);
using namespace std;
typedef long long ll;
ll inf = 2e9;
ll N,M,K;
array<ll,3> edges[400001];
struct DSU{
int grp[200001];
void init(int n){forf(i,1,n) grp[i] = i;}
int fi(int x){
if(grp[x] == x) return x;
return grp[x] = fi(grp[x]);
}
void un(int x, int y){
x = fi(x), y = fi(y);
grp[x] = y;
}
} dsu1, dsu2;
ll S[200001];
int grpnum = 1;
int ngrp[200001],ngrpchk[200001];
ll siz[51];
ll cost[51];
vector<int> cross;
vector<pair<int,int> > adj[51];
ll ans;
ll dfs(int now, int p){
ll s = siz[now];
for(auto [nxt,ind] :adj[now]) if(nxt!=p){
ll subs = dfs(nxt,now);
if(ind > M) ans += cost[ind-M]*subs;
s += subs;
}
return s;
}
int upd(int now, int p, int goal, ll w){
if(now == goal) return 1;
int ret = 0;
for(auto [nxt,ind] : adj[now]) if(nxt!=p){
if(upd(nxt,now,goal,w) == 1){
ret = 1;
if(ind > M) cost[ind-M] = min(cost[ind-M], w);
}
}
return ret;
}
int main(){
cin>>N>>M>>K;
vector<pair<ll,int> > allg,org;
forf(i,1,M) cin>>edges[i][0]>>edges[i][1]>>edges[i][2], allg.pb({edges[i][2], i}) ,org.pb({edges[i][2], i});
forf(i,1,K) cin>>edges[M+i][0]>>edges[M+i][1], allg.pb({0, M+i});
forf(i,1,N) cin>>S[i];
sort(all(allg)), sort(all(org));
dsu1.init(N),dsu2.init(N);
for(auto [c,ind] : allg){
int u = edges[ind][0], v = edges[ind][1];
if(dsu1.fi(u) != dsu1.fi(v)){
dsu1.un(u,v);
if(c!=0) dsu2.un(u,v);
}
}
forf(i,1,N){
if(ngrpchk[dsu2.fi(i)] == 0) ngrpchk[dsu2.fi(i)] = grpnum, grpnum++;
ngrp[i] = ngrpchk[dsu2.fi(i)];
siz[ngrp[i]]+=S[i];
}
grpnum--;
assert(grpnum <= K+1);
set<pair<int,int> > m;
dsu1.init(N);
for(auto [c,ind] : org){
int u = edges[ind][0], v = edges[ind][1];
if(dsu1.fi(u) != dsu1.fi(v)){
dsu1.un(u,v);
if(ngrp[u] != ngrp[v]) cross.pb(ind), m.insert({ngrp[u],ngrp[v]});
}
}
assert(sz(cross) <= K);
ll rans=0;
forf(bit,0,(1<<K)-1){
forf(i,1,grpnum) adj[i].clear();
forf(i,1,K) cost[i] = inf;
dsu1.init(grpnum);
vector<pair<ll,int> > g;
vector<int> nc;
for(int i :cross) g.pb({edges[i][2], i});
int cnt=0;
forf(i,1,K) if(bit & (1<<(i-1))) g.pb({0, M+i}),cnt++;
if(cnt<K-8) continue;
sort(all(g));
for(auto [c,ind] : g){
int u = ngrp[edges[ind][0]], v= ngrp[edges[ind][1]];
assert(u!=v);
if(dsu1.fi(u) != dsu1.fi(v)){
dsu1.un(u,v);
adj[u].pb({v,ind}), adj[v].pb({u,ind});
}
else if(ind <= M) nc.pb(ind);
}
for(int ind : nc){
int u = ngrp[edges[ind][0]], v= ngrp[edges[ind][1]];
ll w = edges[ind][2];
auto trash = upd(u,-1,v,w);
}
ans = 0;
auto realtrash = dfs(ngrp[1],-1);
rans = max(ans,rans);
}
cout<<rans;
}
Compilation message
toll.cpp: In function 'int main()':
toll.cpp:123:18: warning: unused variable 'trash' [-Wunused-variable]
123 | auto trash = upd(u,-1,v,w);
| ^~~~~
toll.cpp:127:14: warning: unused variable 'realtrash' [-Wunused-variable]
127 | auto realtrash = dfs(ngrp[1],-1);
| ^~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
600 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
600 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
344 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
600 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
344 KB |
Output is correct |
5 |
Correct |
7 ms |
860 KB |
Output is correct |
6 |
Correct |
4 ms |
860 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
600 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
344 KB |
Output is correct |
5 |
Correct |
7 ms |
860 KB |
Output is correct |
6 |
Correct |
4 ms |
860 KB |
Output is correct |
7 |
Correct |
308 ms |
18932 KB |
Output is correct |
8 |
Correct |
319 ms |
19100 KB |
Output is correct |
9 |
Correct |
322 ms |
19104 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
600 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
344 KB |
Output is correct |
5 |
Correct |
7 ms |
860 KB |
Output is correct |
6 |
Correct |
4 ms |
860 KB |
Output is correct |
7 |
Correct |
308 ms |
18932 KB |
Output is correct |
8 |
Correct |
319 ms |
19100 KB |
Output is correct |
9 |
Correct |
322 ms |
19104 KB |
Output is correct |
10 |
Correct |
959 ms |
19104 KB |
Output is correct |
11 |
Correct |
1236 ms |
19104 KB |
Output is correct |
12 |
Correct |
1252 ms |
25604 KB |
Output is correct |