30分求助
查看原帖
30分求助
227728
冰糖鸽子TJ鸽子协会楼主2020/10/25 17:35

RT,7个点WA


// Problem: P3574 [POI2014]FAR-FarmCraft
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3574
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
int n,l,r,a[1000010],vis[1000010],siz[1000010],f[1000010],sorted[1000010];
vector<int>road[500010];
bool cmp(int a,int b)
{
	return (siz[a]-f[a])<(siz[b]-f[b]);
}
void done(int x,int y)
{
	if(x!=1)
	{
		f[x]=a[x];
	}
	int cnt=0;
	vis[x]=1;
	for(int i=0;i<int(road[x].size());i++)
	{
		if(road[x][i]!=y)
		{
			done(road[x][i],x);
			cnt++;
			sorted[cnt]=road[x][i];
		}
	}
	sort(sorted+1,sorted+1+cnt,cmp);
	for(int i=1;i<=cnt;i++)
	{
		f[x]=max(f[x],f[sorted[i]]+siz[x]+1);
		siz[x]+=siz[sorted[i]];
		siz[x]+=2; 
	}
	//cout << x << "'s f,siz,cnt:" << f[x] << ' ' << siz[x] << ' ' << cnt << endl;
}
int main()
{
	cin >> n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<n;i++)
	{
		cin>>l>>r;
		road[l].push_back(r);
		road[r].push_back(l);
	}
	done(1,0);
	cout <<max(f[1],siz[1]+a[1]);
	return 0;
}
2020/10/25 17:35
加载中...