萌新求助,WA了15个点/kk
查看原帖
萌新求助,WA了15个点/kk
374756
忘怜城羡楼主2024/5/10 19:44

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5+7;
int a[MAXN],b[MAXN],c[MAXN],f[MAXN],ls[MAXN],rs[MAXN],fa[MAXN],cnt,ans=1e18+7,tot;
struct node{
	int u,v,s;
	bool operator < (const node &x){
		return s<x.s;
	}
}g[MAXN];
int find(int x)
{
	if(f[x]==x)
		return x;
	return f[x]=find(f[x]);
}
void dfs(int x,int sum)
{
	if(!ls[x]&&!rs[x])
	{
		ans=min(ans,max(sum,c[x]));
		return ;
	}
	dfs(ls[x],max(sum,c[x]-b[ls[x]]));
	dfs(rs[x],max(sum,c[x]-b[rs[x]]));
}
signed main()
{
	int n,m;
	scanf("%lld%lld",&n,&m);
	cnt=n;
	for(int i(1);i<=n*2;++i)
		f[i]=fa[i]=i;
	for(int i(1);i<=n;++i)
	{
		scanf("%lld%lld",&a[i],&b[i]);
		tot+=b[i];
		c[i]=max(a[i]-b[i],0LL);
	}
	for(int i(1);i<=m;++i)
	{
		scanf("%lld%lld",&g[i].u,&g[i].v);
		g[i].s=max(c[g[i].u],c[g[i].v]);
	}
	sort(g+1,g+m+1);
	for(int i(1);i<=m;++i)
	{
		int fu=find(g[i].u),fv=find(g[i].v);
		if(fu==fv)
			continue;
		int nowid=++cnt;
		fa[fu]=fa[fv]=f[fu]=f[fv]=nowid;
		ls[nowid]=fu;
		rs[nowid]=fv;
		c[nowid]=g[i].s;
	}
	for(int i(1);i<=cnt;++i)
		b[fa[i]]+=b[i];
	dfs(cnt-1,0);
	printf("%lld",ans+tot);
	return 0;
}
2024/5/10 19:44
加载中...