Codevs 3728 联合权值 题解

3728 联合权值

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold



题目描述 Description

Codevs 3728 联合权值 题解_第1张图片

输入描述 Input Description

Codevs 3728 联合权值 题解_第2张图片

输出描述 Output Description

blob.png

样例输入 Sample Input

Codevs 3728 联合权值 题解_第3张图片

样例输出 Sample Output

Codevs 3728 联合权值 题解_第4张图片

Codevs 3728 联合权值 题解_第5张图片

数据范围及提示 Data Size & Hint







#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;

vector<int>t[200010];
int a[200010],u,v,sum=0,pow=0,m1=0,m2=0,n,k,ans,sm;

int main(){
	cin>>n;
	for(int i=1;i<=n-1;i++){
		cin>>u>>v;
		t[u].push_back(v);
		t[v].push_back(u);
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	
	for(int i=1;i<=n;i++){
		
	    m1=m2=0;
		sum=pow=0;
		for(int j=0;j<t[i].size();j++){
			k=a[t[i][j]];
			sum+=k;
			sum%=10007;
			pow+=(k*k);
			pow%=10007;
			if(k>m1){
			m2=m1;
			m1=k;
			}
			else if(k>m2)m2=k;	
			
		}
		//cout<<i<<' '<<m1*m2<<' '<<sum*sum-pow<<endl;;
		sum=sum%10007;pow=pow%10007;
		if(sm<(m1*m2))sm=m1*m2;
		ans+=(sum*sum-pow);
		ans%=10007;
	}
	//for(int i=0;i<n;i++)for(int j=0;j<t[i].size();j++){
	//k=a[t[i][j]];
	//cout<<i<<j<<k<<endl;	
	//}
	
	cout<<sm<<' '<<ans;
	return 0;
}


时间复杂度 O(n)

权值为2→同一个点相邻的两个点

用(m1+m2+m3+……)^2-m1^2-m2^2-……累加求和

注意最大值和次大值 注意最大值和次大值 注意最大值和次大值

你可能感兴趣的:(Codevs 3728 联合权值 题解)