题目大意:

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

思路:

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

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

代码:

  邻接表:

  1. #include<cstdio>
  2. const int mo=,M=;
  3. int cnt,x,y,n,i,ans,tot,w[M],v[M<<],last[M<<],head[M<<];
  4.  
  5. void add(int x,int y) { v[++cnt]=y,last[cnt]=head[x],head[x]=cnt; }
  6.  
  7. int main()
  8. {
  9. scanf("%d",&n);
  10. for (i=;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x);
  11. for (i=;i<=n;i++) scanf("%d",&w[i]);
  12. for (i=;i<=n;i++)
  13. {
  14. int sum=,max1=,max2=,j,o;
  15. for (j=head[i];j;j=last[j])
  16. {
  17. o=w[v[j]];
  18. sum=(sum+o)%mo;
  19. if (o>max1) max2=max1,max1=o;
  20. else if (o>max2) max2=o;
  21. tot=(tot-o*o)%mo;
  22. }
  23. tot=(tot+sum*sum)%mo;
  24. sum=max1*max2;
  25. if (sum>ans) ans=sum;
  26. }
  27. printf("%d %d\n",ans,tot);
  28. return ;
  29. }

  %%%cyk大神:

  1. #include<iostream>
  2. using namespace std;
  3. int i,n,maxx,ans,x[],y[],w[];
  4. int am[],am2[],s[],qs[];
  5. int main()
  6. {
  7. cin>>n;
  8. for (i=;i<=n-;i++) cin>>x[i]>>y[i];
  9. for (i=;i<=n;i++) cin>>w[i];
  10. for (i=;i<=n-;i++)
  11. {
  12. s[x[i]]=(s[x[i]]+w[y[i]])%;
  13. qs[x[i]]=(qs[x[i]]+w[y[i]]*w[y[i]])%;
  14. s[y[i]]=(s[y[i]]+w[x[i]])%;
  15. qs[y[i]]=(qs[y[i]]+w[x[i]]*w[x[i]])%;
  16. if (w[y[i]]>am[x[i]]) {am2[x[i]]=am[x[i]];am[x[i]]=w[y[i]];}
  17. else if (w[y[i]]>am2[x[i]]) am2[x[i]]=w[y[i]];
  18. if (w[x[i]]>am[y[i]]) {am2[y[i]]=am[y[i]];am[y[i]]=w[x[i]];}
  19. else if (w[x[i]]>am2[y[i]]) am2[y[i]]=w[x[i]];
  20. }
  21. maxx=;
  22. for (i=;i<=n;i++) maxx=max(maxx,am[i]*am2[i]);
  23. ans=;
  24. for (i=;i<=n;i++) ans=(ans+s[i]*s[i]-qs[i])%;
  25. cout<<maxx<<' '<<ans;
  26. }

[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. 大熊君大话NodeJS之------MongoDB模块(额外篇)

    一,开篇分析 这篇属于扩展知识篇,因为在下面的文章中会用到数据库操作,所以今天就来说说它(Mongodb模块). (1),简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为 ...

  2. codevs1540 银河英雄传说

    描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集 ...

  3. 微信电脑版-微信for windows客户端发布

    12月份微信Windows版客户端1.0 Alpha推出,昨天微信for windows 1.0客户端(测试版)发布更新,超过三亿人使用的聊天应用,现在登录Windows桌面.你可以在Windows上 ...

  4. ViewPager切换滑动速度修改

    ViewPager的setCurrentItem 滑动速度是写死地 下面的方法可以修改,在此以做记录 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  5. single-table inheritance 单表继承

    type 字段在 Rails 中默认使用来做 STI(single-table inheritance),当 type 作为普通字段来使用时,可以把SIT的列设置成别的列名(比如不存在的某个列). 文 ...

  6. r-cnn学习(五):SmoothL1LossLayer论文与代码的结合理解

    A Loss Function for Learning Region Proposals 训练RPN时,只对两种anchor给予正标签:和gt_box有着最高的IoU && IoU超 ...

  7. (原)android的alertdialog中加入edittext但是不弹出软键盘等问题的解决与原因

    摘要:alertdialog中加入edittext但是不弹出软键盘等问题网上有很多不管用的解决方案, 本文意在给出更有效的解决办法,并初步探究其原因 正文 在对话框中插入文本框是十分常见的需求 通常我 ...

  8. Java中的Serializable接口transient关键字,及字节、字符、对象IO

    1.什么是序列化和反序列化Serialization是一种将对象转为为字节流的过程:deserialization是将字节流恢复为对象的过程. 2.什么情况下需要序列化a)当你想把的内存中的对象保存到 ...

  9. iframe使用方法

    --点击按钮会把地址里的页面显示在oframe里,对iframe可以设置宽和高<iframe src="demo_iframe.htm" name="iframe_ ...

  10. C Primer Plus_第10章_数组和指针_编程练习

    1. /*rain.c 针对若干年的降水量数据,计算年降水总量.年降水平均量,以及月降水平均量*/ #include <stdio.h> #define MONTHS 12 #define ...