[NOIP2014]联合权值
NOIp2014提高组
【题目描述】
无向连通图G 有n 个点,n - 1 条边。点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 。图上两点( u , v ) 的距离定义为u 点到v 点的最短距离。对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu
×Wv 的联合权值。
请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?
【输入输出格式】
输入格式:
输入文件名为link .in。
第一行包含1 个整数n 。
接下来n - 1 行,每行包含 2 个用空格隔开的正整数u 、v ,表示编号为 u 和编号为v 的点之间有边相连。
最后1 行,包含 n 个正整数,每两个正整数之间用一个空格隔开,其中第 i 个整数表示图G 上编号为i 的点的权值为W i 。
输出格式:
输出文件名为link .out 。
输出共1 行,包含2 个整数,之间用一个空格隔开,依次为图G 上联合权值的最大值
和所有联合权值之和。由于所有联合权值之和可能很大,输出它时要对10007 取余。
【输入输出样例】
输入样例#1:
5 1 2 2 3 3 4 4 5 1 5 2 3 10
输出样例#1:
20 74
【说明】
本例输入的图如上所示,距离为2 的有序点对有( 1,3) 、( 2,4) 、( 3,1) 、( 3,5) 、( 4,2) 、( 5,3) 。
其联合权值分别为2 、15、2 、20、15、20。其中最大的是20,总和为74。
【数据说明】
对于30% 的数据,1 < n≤ 100 ;
对于60% 的数据,1 < n≤ 2000;
对于100%的数据,1 < n≤ 200 , 000 ,0 < wi≤ 10, 000 。
【思路】
60%:用暴力搜索可以将解决60%的数据,如果i和j相连,j和k相连,i和k不相连,那么可以认为i和k可以构成联合最大权值,用一个O(N^3)的循环即可。
100%:
这个题AC的思路很多,可以跑树,用LCA处理两个兄弟之间的关系,也可以跑图,想要,存储一定要用前向星。(不会问度娘)。我能够AC还要感谢@yangs_s,如果不是他的博客http://blog.csdn.net/yangs_s/article/details/47359967,这个题我也做不出AC来的,我在这里把他的思路说一下吧。
有两个关键点。
首先输出分为两部分,可以把题目分成两部分来看,对一个点来说,最大的乘积自然就是和它相邻的两个权值最大的节点的权值的乘积, 读入后顺手处理一下就能出来。
第二个关键点就是加法结合律。
没错,加法结合律!
我看到神犇的博客后伏案长叹,这是小学三年级的内容,我就这样还给老师了。
我们假设和o点相邻的点有a,b,c,d,e,f,g七个,假设他们的权值就是a,b,c,d,e,f,g。某二逼青年的计算过程是这样的:sum:=a·b+a·c+a·d…….+a….+e*g….,但其实我们这样处理,我们先用加法运算法则,发现sum其实就是每个点的权值乘以可以联合(距离为2)的节点的所有权值之和,所以说,我们在读入数据的时候,可以预先处理一下,把每个节点周围相邻节点的权值之和给加起来,就以上述为例,在处理时,把a,b,c….g的权值加起来为s[o]{o点相邻点的权值之和},然后在计算时,就可以用sum:=a·(s[o]-a)+b·(s[o]-b)…..很自然的结果就出来了!
算法的时间复杂度应该是O(kn),k应该是一个很小很小远小于N的常数,应该和LCA的差不多了吧。
const ma=10007; const mx=200000;type ss=recordu,v:longint;end;var s:array[1..mx] of int64;//s[i]表示和结点i所有相连的点的权值之和e:array[1..mx] of ss;//存的是边w,max1,max2:array[1..mx]of longint; {w[i]表示第i个点的权值max1[i]表示和i相连得结点中权值最大的结点max2[i]表示和i相连得结点中权值最小的结点}n,i,j,ans1,ans2:longint;procedure box; var i,j:longint; beginfillchar(s,sizeof(s),0);fillchar(e,sizeof(e),0);fillchar(w,sizeof(w),0);fillchar(max1,sizeof(max1),0);fillchar(max2,sizeof(max2),0);ans1:=0;ans2:=0; end; //变量初始化procedure work(x:longint;var a,b:longint); //x的值是不会被改变的,a和b是可以被改变的 begin //首先已经得出值的数组是合法的,再次更改过后也一定是合法的if x>a thenbeginb:=a;a:=x;endelseif x>b then b:=x; end; //用来比较大小的过程,必须用全局变量procedure change; var i,u,v:longint; beginfor i:=1 to n-1 dobeginu:=e[i].u;v:=e[i].v;inc(s[u],w[v]);inc(s[v],w[u]);work(w[v],max1[u],max2[u]);work(w[u],max1[v],max2[v]);//不断更新结点周围的最大值和次大值end; end; //预处理程序procedure main1; var i:longint; beginfor i:=1 to n doif max1[i]*max2[i]>ans1 thenans1:=max1[i]*max2[i]; end; //处理最大的联合权值procedure main2; var i,j,u,v:longint; beginfor i:=1 to n-1 dobeginu:=e[i].u;v:=e[i].v;ans2:=(ans2+((s[u]-w[v])*w[v]) mod ma) mod ma;ans2:=(ans2+((s[v]-w[u])*w[u]) mod ma) mod ma;end; end; //处理权值之和procedure init; var i,j:longint; beginreadln(n);for i:=1 to n-1 doreadln(e[i].u,e[i].v);for i:=1 to n do read(w[i]); end;procedure printf; beginwriteln(ans1,' ',ans2); end;beginbox;init;change;main1;main2;printf; end.
转载于:https://www.cnblogs.com/yangqingli/p/4721774.html
[NOIP2014]联合权值相关推荐
- [Luogu 1351] NOIP2014 联合权值
[Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...
- NOIP2014联合权值
枚举+乘法结合律 枚举每个点左右相邻的两个点乘积和,做(a+b+c...)(a+b+c...)的时候展开减掉a^2+b^2+c^2再除以2就是答案了 注意爆int取模 1 #include<io ...
- 联合权值 NOIP2014 提高组 Day1 T2
codevs 3728 联合权值 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距 ...
- 【学术篇】luogu1351[NOIP2014 提高组]联合权值
一道提高组的题..... 传送门:题目在这里.... 现在都懒得更自己的blog了,怕是太颓废了_ (:з」∠) _ 好久没做题了,手都生了.(好吧其实是做题方面手太生了) 这题我都不想讲了,把代码一 ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- P1351 联合权值[鬼畜解法]
题目描述 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v 点的最短距离 ...
- 洛谷 1351 联合权值
[题解] 每个点维护各个儿子的前后缀最大值.权值和,这样就可以统计儿子之间相乘的答案.然后每个节点再乘它的祖父的权值去更新答案即可. 1 #include<cstdio> 2 #inclu ...
- Jzoj3931【NOIP2014day1官方数据】联合权值
题意略过,口胡正解 对于每个节点i,我们求出每个与i相连的节点的权值和s,那么i的贡献就是∑d[j]*(s-d[j]) 求最大就排个序咯 #include<stdio.h> #includ ...
- 洛谷P1351 联合权值(树形dp)
题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...
最新文章
- Android开发之ListView子布局item高度的问题
- java 中符号_谁能告诉我java中符号的用法,见代码
- 【计算机科学基础】计算机不需要整数减法器的原因
- OJ1003: 两个整数的四则运算
- PL/SQL Developer SQL Window中不能插入多条数据
- 尝试引用非结构体数组的字段_剖析PHP底层数组是如何实现的
- 计算机考研408的优势和劣势,21考研:杭州电子科技大学计算机改考408!透露2个信号,咋整?...
- George Moody 对OSEA 软件的修改
- AS中几个较好的插件
- kettle 数据库密码解密
- 盘点那些年我们一起玩过的网络安全工具
- linux进程终止命令,Linux kill命令:终止进程
- 如何解决 Windows 2000 设备管理器中列出的未知设备问题(转)
- 神经网络不work该怎么办!看看这11条
- python非线性最小二乘拟合_非线性函数的最小二乘拟合——兼论Jupyter notebook中使用公式 [原创]...
- [转载]kindle屏幕出现小黑点,怎么办?
- 【数据结构】之两栈共享空间(C语言)
- 顺口溜记23种设计模式
- 电脑上不去网的6点原因
- java 支付宝回调校验签名_支付宝异步回调验证签名