[NOIP2014]联合权值 题解
题目大意:
有一棵树,求距离为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]联合权值 题解的更多相关文章
- [Luogu 1351] NOIP2014 联合权值
[Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...
- NOIP2014 联合权值
2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u ...
- 【洛谷P1351】[NOIP2014]联合权值
联合权值 题目链接 首先,直接两重循环暴力枚举得了70分 然后发现第二重循环可以记忆化一下 记忆一下每个点的子节点的权值和.最大值. 次大值(为了处理该点的父节点权值恰好为最大值) 具体看代码 #in ...
- NOIP2014联合权值
无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离 ...
- 洛谷 P1351 联合权值 题解
P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\),每条 ...
- Luogu P1351 联合权值 题解
这是一个不错的树形结构的题,由于本蒟蒻不会推什么神奇的公式其实是懒得推...,所以很愉快的发现其实只需要两个点之间的关系为祖父和儿子.或者是兄弟即可. 然后问题就变得很简单了,只需要做一个正常的DFS ...
- luogu1351 [NOIp2014]联合权值 (dfs)
有两种情况:一个点到它的父亲的父亲(要算两次).一个点的子节点之间互相到达 #include<bits/stdc++.h> #define pa pair<int,int> # ...
- NOIP 2004 联合权值
洛谷 P1351 联合权值 洛谷传送门 JDOJ 2886: [NOIP2014]联合权值 D1 T2 JDOJ传送门 Description 无向连通图 G有 n个点,n-1条边.点从 1到 n依次 ...
- 「NOIP2014」「Codevs3728」 联合权值(乱搞
3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 输入描述 Input Description 输出描述 Ou ...
随机推荐
- centos6.5升级python为2.7
今天线上服务器全部升级python环境为python-2.7.6的环境,我采用的方法是ansible+shell,代码如下,友提,Python-2.7.6.tgz.setuptools-14.3.1. ...
- Fast Member
https://github.com/mgravell/fast-member/ http://stackoverflow.com/questions/6158768/c-sharp-reflecti ...
- JSONP 理解 和 实例 讲解
1.什么是jsonp 1.1 同源策略 浏览器同源策略的限制,XmlHttpRequest只允许请求当前源(相同域名.协议.端口)的资源. -1)jsonp只支持get请求 -2)不受同源策略限制 , ...
- tyvj1034 尼克的任务
描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成.尼克的一个工作日为N分钟,从第一分钟开始到第N ...
- jaxb
一.简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实 ...
- STM32f103之外部中断
一.背景 有个需求,IO口检测上升沿,然后做相应的动作.在此记录STM32F103的外部中断结构及配置方法, 以备下次快速上手使用. 有许多不太明白,又是老司机(:-D)帮忙,真的是站在别人的肩膀上会 ...
- Nginx 限速模块一览
为了保护服务器不被刷流量,或者业务方面的一些限制,需要做一些限速措施. 一.http 请求并发连接数模块:ngx_http_limit_conn_module 这个模块可以设置每个定义的变量(比如客户 ...
- Android Killer工具用法
一.工程信息 工程信息主要是解析的AndroidManifest文件 二.工程管理器 三.配置插入代码 在代码中点右键就可以一键插入代码了 四.字符串搜索功能 支持正则, 比jeb搜索功能强大 来自为 ...
- vmware esxi 找不到网卡驱动,硬盘的解决方法
解决方法就是把ESXi无法识别的硬件的驱动定制进安装镜像文件中. ESXi 5.5 U2: VMware-VMvisor-Installer-5.5.0.update02-2068190.x86_64 ...
- linux操作oracle
1.su - oracle 2.sqlplus / as sysdba; 1.登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切换成oracle用 ...