题目大意:

  有一棵树,求距离为2的点权的乘积的和以及最大值。

思路:

  枚举每一个点,则与其相邻的点互为距离为2的点。该部分的最大值为点权最大的两个点的积,和为点的权值和的平方减去每个点的平方,这样每条边都被跑了两次,所以复杂度为O(n)。

  用邻接表存储要开双倍数组(无向),当然像cyk大神一样直接跑边就不用考虑这个了。

代码:

  邻接表:

 #include<cstdio>
const int mo=,M=;
int cnt,x,y,n,i,ans,tot,w[M],v[M<<],last[M<<],head[M<<]; void add(int x,int y) { v[++cnt]=y,last[cnt]=head[x],head[x]=cnt; } int main()
{
scanf("%d",&n);
for (i=;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x);
for (i=;i<=n;i++) scanf("%d",&w[i]);
for (i=;i<=n;i++)
{
int sum=,max1=,max2=,j,o;
for (j=head[i];j;j=last[j])
{
o=w[v[j]];
sum=(sum+o)%mo;
if (o>max1) max2=max1,max1=o;
else if (o>max2) max2=o;
tot=(tot-o*o)%mo;
}
tot=(tot+sum*sum)%mo;
sum=max1*max2;
if (sum>ans) ans=sum;
}
printf("%d %d\n",ans,tot);
return ;
}

  %%%cyk大神:

 #include<iostream>
using namespace std;
int i,n,maxx,ans,x[],y[],w[];
int am[],am2[],s[],qs[];
int main()
{
cin>>n;
for (i=;i<=n-;i++) cin>>x[i]>>y[i];
for (i=;i<=n;i++) cin>>w[i];
for (i=;i<=n-;i++)
{
s[x[i]]=(s[x[i]]+w[y[i]])%;
qs[x[i]]=(qs[x[i]]+w[y[i]]*w[y[i]])%;
s[y[i]]=(s[y[i]]+w[x[i]])%;
qs[y[i]]=(qs[y[i]]+w[x[i]]*w[x[i]])%;
if (w[y[i]]>am[x[i]]) {am2[x[i]]=am[x[i]];am[x[i]]=w[y[i]];}
else if (w[y[i]]>am2[x[i]]) am2[x[i]]=w[y[i]];
if (w[x[i]]>am[y[i]]) {am2[y[i]]=am[y[i]];am[y[i]]=w[x[i]];}
else if (w[x[i]]>am2[y[i]]) am2[y[i]]=w[x[i]];
}
maxx=;
for (i=;i<=n;i++) maxx=max(maxx,am[i]*am2[i]);
ans=;
for (i=;i<=n;i++) ans=(ans+s[i]*s[i]-qs[i])%;
cout<<maxx<<' '<<ans;
}

[NOIP2014]联合权值 题解的更多相关文章

  1. [Luogu 1351] NOIP2014 联合权值

    [Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...

  2. NOIP2014 联合权值

    2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u ...

  3. 【洛谷P1351】[NOIP2014]联合权值

    联合权值 题目链接 首先,直接两重循环暴力枚举得了70分 然后发现第二重循环可以记忆化一下 记忆一下每个点的子节点的权值和.最大值. 次大值(为了处理该点的父节点权值恰好为最大值) 具体看代码 #in ...

  4. NOIP2014联合权值

    无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离 ...

  5. 洛谷 P1351 联合权值 题解

    P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\)​,每条 ...

  6. Luogu P1351 联合权值 题解

    这是一个不错的树形结构的题,由于本蒟蒻不会推什么神奇的公式其实是懒得推...,所以很愉快的发现其实只需要两个点之间的关系为祖父和儿子.或者是兄弟即可. 然后问题就变得很简单了,只需要做一个正常的DFS ...

  7. luogu1351 [NOIp2014]联合权值 (dfs)

    有两种情况:一个点到它的父亲的父亲(要算两次).一个点的子节点之间互相到达 #include<bits/stdc++.h> #define pa pair<int,int> # ...

  8. NOIP 2004 联合权值

    洛谷 P1351 联合权值 洛谷传送门 JDOJ 2886: [NOIP2014]联合权值 D1 T2 JDOJ传送门 Description 无向连通图 G有 n个点,n-1条边.点从 1到 n依次 ...

  9. 「NOIP2014」「Codevs3728」 联合权值(乱搞

    3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 输入描述 Input Description 输出描述 Ou ...

随机推荐

  1. 利用Python【Orange】结合DNA序列进行人种预测

    http://blog.csdn.net/jj12345jj198999/article/details/8951120 coursera上 web intelligence and big data ...

  2. 每日学习笔记:js中可以直接用id名调用的问题?

    在JavaScript中,标准的id选择器调用语法是: document.getElementById('myid').style.width = pc + "%"; 但是,今天发 ...

  3. SQL Server附加数据库时报1813错误的解决方案

    SQL Server附加数据库时报1813错误的解决方案   无法打开新数据库 'ASR'.CREATE DATABASE 中止. 文件激活失败.物理文件名称'E:\SqlServer\MSSQL\D ...

  4. 用C#开发ActiveX控件,并使用web调用

    入职差不多两个月了,由学生慢慢向职场人做转变,也慢慢的积累知识,不断的更新自己.最近的一个项目里边,涉及到的一些问题,因为SDK提供的只是winform才能使用了,但是有需求咱们必须得完成啊,所以涉及 ...

  5. JAVA对MySQL数据库的操作

    一.导包: 使用JDBC连接MySQL数据库时,首先需要导入一个第三方的JAR包(点击下载),下载解压得到一个JAR包,并导入到JAVA项目中,如下图: 二.DBHelper类: 代码如下: impo ...

  6. 【Solr】新建core后,启动服务访问web报错 HTTP Status 503

    新建core collection2后,启动solr服务,访问solr web界面报错. HTTP Status 503 - Server is shutting down or failed to ...

  7. 兼容IE6的min-width、min-height

    如果一个站是宽屏的,你左右拖动浏览器的窗口网站宽度会随着窗口的大小而改变,而浏览器窗口宽度减小到一定程度后就会出现下边的滚动条,网站宽度就不会再减小了,我们知道这一简单的功能用css的min-widt ...

  8. GDI+ 笔记

    1.GDI+模板 #include<windows.h> #include<GdiPlus.h> #include <time.h> #include <ma ...

  9. 【C语言入门教程】目录/大纲

    第一章 C语言编程基础 1.1 基本程序结构 1.2 函数库 和 链接 1.3 C语言“32个”关键字 第二章 数据类型.运算符和表达式 2.1 数据类型(5种基本数据类型),聚合类型与修饰符 2.2 ...

  10. 学习 opencv---(1) opencv3.1.0 组件结构浅析

    本系列是根据 浅墨大神 的opencv系列而写的,,应该大部分内容会一样..如有侵权还请告知........... 开发环境:win7 + VS2013 + opencv3.1.0 至于OpenCV组 ...