Submission #1184880

#TimeUsernameProblemLanguageResultExecution timeMemory
1184880UmairAhmadMirzaPhone Plans (CCO22_day2problem2)C++20
0 / 25
201 ms36404 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
int const N=4e5+5;
int const inf=2e9+7;

int n,a,b,k;

int rep[N];
vector<int> st[N];

signed main(){
	cin>>n>>a>>b>>k;
	for (int i = 0; i <=n; ++i)
	{
		rep[i]=i;
		st[i].push_back(i);
	}
	vector<vector<int>> edg1,edg2;
	for (int i = 0; i < a; ++i)//odd
	{
		int u,v,l;
		cin>>u>>v>>l;
		edg1.push_back({l,u,v});
	}
	for (int i = 0; i < b; ++i)//even
	{
		int u,v,l;
		cin>>u>>v>>l;
		edg2.push_back({l,u,v});
	}
	vector<pair<int,int>> lst1,lst2;
	sort(edg1.begin(), edg1.end());
	sort(edg2.begin(), edg2.end());
	lst1.push_back({0,0});
	lst2.push_back({0,0});
	int tot1=0,tot2=0;
	for (int i = 0; i < a; ++i)
	{
		int u=edg1[i][1],v=edg1[i][2],l=edg1[i][0];
		u=rep[u];
		v=rep[v];
		if(u==v)
			continue;
		if(st[u].size()<st[v].size())
			swap(u,v);
		int c=(st[u].size());
		c*=(st[v].size());
		tot1+=c;
		for(int i:st[v]){
			rep[i]=u;
			st[u].push_back(i);
		}
		st[v].clear();
		lst1.push_back({tot1,l});
	}
	for (int i = 0; i < a; ++i)
	{
		int u=edg2[i][1],v=edg2[i][2],l=edg2[i][0];
		u=rep[u];
		v=rep[v];
		if(u==v)
			continue;
		if(st[u].size()<st[v].size())
			swap(u,v);
		int c=(st[u].size());
		c*=(st[v].size());
		tot2+=c;
		for(int i:st[v]){
			rep[i]=u;
			st[u].push_back(i);
		}
		st[v].clear();
		lst2.push_back({tot2,l});
	}
	int cost=inf;
	int p2=(lst2.size())-1;
	for(auto [nm1,c1]:lst1){
		while(p2>0 && lst2[p2-1].first+nm1>=k){
			p2--;
		}
		if(lst2[p2].first+nm1>=k)
			cost=min(cost,c1+lst2[p2].second);
	}
	if(cost==inf){
		cout<<-1<<endl;
		return 0;
	}
	cout<<cost<<endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...