Submission #1131302

#TimeUsernameProblemLanguageResultExecution timeMemory
1131302Math4Life2020Security Guard (JOI23_guard)C++20
50 / 100
305 ms39668 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>;
const ll Nm = 4e5+5;

ll f[Nm]; //forward
ll fsz[Nm]; //size 
ll mval[Nm]; //max val of S

ll gt(ll x) {
	if (f[x]==x) {
		return x;
	}
	return (f[x]=gt(f[x])); //ackermann dsu impl
}

void fz(ll x, ll y) {
	x = gt(x); y=gt(y);
	if (fsz[x]>fsz[y]) {
		swap(x,y);
	}
	f[x]=y;
	fsz[y]+=fsz[x];
	mval[y]=max(mval[y],mval[x]);
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
	ll N,M,Q; cin >> N >> M >> Q;
	ll S[N];
	bool ispr[N];
	vector<ll> adj[N];
	vector<pii> ord;
	ll ans = 0;
	ll maxS = 0;
	for (ll i=0;i<N;i++) {
		ispr[i]=0;
		cin >> S[i];
		ans -= S[i];
		maxS = max(maxS,S[i]);
		f[i]=i;
		fsz[i]=1;
		mval[i]=S[i];
		ord.push_back({S[i],i});
	}
	ans += maxS;
	vector<pii> srtedg; //{weight, index}
	vector<pii> edg;
	for (ll m=0;m<M;m++) {
		ll a,b; cin >> a >> b;
		a--; b--;
		adj[a].push_back(b);
		adj[b].push_back(a);
		srtedg.push_back({S[a]+S[b],m});
		edg.push_back({a,b});
	}
	sort(srtedg.begin(),srtedg.end());
	for (pii p0: srtedg) {
		ll m = p0.second;
		ll wt = p0.first;
		ll a = edg[m].first; ll b = edg[m].second;
		if (gt(a)!=gt(b)) {
			ans += wt;
			fz(a,b);
		}
	}
	cout << ans << "\n";
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...