题目描述 Description

codevs3728 联合权值-LMLPHP

输入描述 Input Description

codevs3728 联合权值-LMLPHP

输出描述 Output Description

codevs3728 联合权值-LMLPHP

样例输入 Sample Input

codevs3728 联合权值-LMLPHP

样例输出 Sample Output

codevs3728 联合权值-LMLPHP

codevs3728 联合权值-LMLPHP

数据范围及提示 Data Size & Hint

codevs3728 联合权值-LMLPHP

思路:
1、以每一个点为轴,左右两个点算权值
2、注意加法结合律(a+b+c) = a + b + c + 2ab + 2ac + 2bc
3、取模问题,(a+b)%c ≠ (a%c + b%c)%c,(a + b) % c = (a + b%c)%c
代码:
(注意链式前向星的使用)
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn =;
struct edge{
int next;
int to;
int power;
};
edge test[maxn];
int head[maxn],cur = ,n,j[maxn],p[maxn],max1[maxn],max2[maxn],nmax1[maxn],coun[maxn];
long long int vall = ,vmax = ,sub =; int use(int i)
{
int t=head[i];
int ti,tmp,sum=,cha2=; while (t!=-)
{ ti=test[t].to;
sum=(sum+p[ti]%)%;
cha2+=p[ti]*p[ti]%;
if (p[ti]>max1[i] )
{ max1[i]=p[ti];
nmax1[i]=ti;
}
t=test[t].next;
coun[i]++; }
sum=(sum*sum% +-cha2%)%;
vall+=sum%;
return sum;
} /*int dfs(int deep,int last,int now){
if(deep == 2){
if(last == now) return 0;
int temp;
temp = p[now]* p[last];
if(temp > vmax) vmax = temp;
return 0;
} for(int k=head[now];k>-1;k=test[k].next){
dfs(deep + 1,last,test[k].to);
}
} */
void dfs(int i)
{ int ansi=;
if (coun[i]>)
{
int t=head[i];
int ti;
while (t!=-)
{
ti=test[t].to;
if (ti!=nmax1[i] )
{
if (p[ti]>max2[i] )
max2[i]=p[ti];}
t=test[t].next;
}
}
if (vmax<max1[i]*max2[i] ) vmax=max1[i]*max2[i]; } void add(int u,int v,int w){
test[cur].power = w;
test[cur].to = v;
test[cur].next = head[u];
head[u] = cur++;
}
int main(){
cin>>n;
int u,v,w;
for(int i = ;i < n;i++){
test[i].power = ;
test[i].next = -;
head[i] = -;
j[i] = ;
}
int tu,tv;
for(int i = ;i < n-;i++){
cin>>tu>>tv;
tu--;
tv--;
add(tu,tv,);
add(tv,tu,); }
for(int i = ;i < n;i++) cin>>p[i]; for(int i = ;i < n;i++)use(i);
for(int i = ;i < n;i++)dfs(i);
cout<<vmax<<" "<<vall % <<endl;
return ;
}
05-11 09:42
查看更多