Submission #1131301

#TimeUsernameProblemLanguageResultExecution timeMemory
1131301Math4Life2020Security Guard (JOI23_guard)C++20
37 / 100
188 ms23216 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;
	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);
	}
	sort(ord.begin(),ord.end());
	for (pii p1: ord) {
		ll x = p1.second;
		ispr[x]=1;
		for (ll y: adj[x]) {
			if (ispr[y]) {
				//ans += (S[y]+S[x]-mval[gt(y)]);
				ans += (S[y]+S[x]);
				fz(x,y);
			}
		}
	}
	cout << ans << "\n";
}

//sum of mval[gt(y)] is just sum of all non-maximal S??!!?
#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...