NOIP2014联合权值——史上最强解析
来源:互联网 发布:美工岗位描述 编辑:程序博客网 时间:2024/06/06 01:44
[解题思路]
(虽然说下面的话可能有点多,但鄙人还是希望各位能看完,对理解大有裨益)
总的来说,本体让求两个值,一个所有权值联合后的和,二是最大的联合权值,那好,我们暂且先来看看这最大的联合权值
所谓联合权值,就是两个距离为2的节点的全职的乘积,那怎么乘着最大呢?对一个点来说,最大的乘积自然就是和它相邻的两个权值最大的节点的权值的乘积,
至于求这两个最大值,我们完全可以在读入数据的时候顺便处理一下嘛,举手之劳而已!!
对于所有的联合权值之和,我们要求你还是要有一点数学基础的,但也不高,三年级就足够了!!你先想一想,我们怎么来求这个和呢?哦!无非就是把所有的
加起来而已嘛!对啊, 但是怎么加着快呢?你想一想,哦,一个点旁边有好多个点,每两个都乘一下,真的好麻烦啊!!有什么传说级别的算法能处理一下吗?
不,没有。有的只有一个,那叫做,加法结合律!!!
好吧,我也不装了,你想一想,和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(n),肯定不超时的!!!
[参考程序]
program link;type edge=record//用来存储边,u和v代表两个节点 u,v:longint; end;var n,i,j,ans1,ans2,u,v:longint; s:array[1..200000]of int64;//s数组用来存储和节点i相邻的所有点的权值之和 w,max1,max2:array[1..200000]of longint;//w数组用来存储每个边的权值,max1用来存储每个节点相邻节点中权值最大的节点权值,max2来存储次大的节点权值 e:array[1..200000]of edge;//存储边procedure work(x:longint;var a,b:longint);//注意,这个过程是比大小的,但由于比较的结果必须返回,所以必须用全局变量,括号里的var是不可或缺的begin if x>a then begin b:=a; a:=x; end else if x>b then b:=x;end;begin readln(n); for i:=1 to n-1 do readln(e[i].u,e[i].v);//读入每个边的两个端点 for i:=1 to n do read(w[i]);//读入权值 for i:=1 to n-1 do //对值进行预处理 begin u:=e[i].u; v:=e[i].v; inc(s[u],w[v]);//等同于s[u]:=s[u]+w[v],意在计算u节点的相邻节点的权值总和 inc(s[v],w[u]);//同上 work(w[v],max1[u],max2[u]);//不断地更新节点周围权值的最大与次大值 work(w[u],max1[v],max2[v]);//同上 end; for i:=1 to n do if max1[i]*max2[i]>ans1 then ans1:=max1[i]*max2[i];//计算最大的联合权值 for i:=1 to n-1 do//对每条边的两个节点进行处理 begin u:=e[i].u; v:=e[i].v; ans2:=(ans2+(s[u]-w[v])*w[v] mod 10007)mod 10007; ans2:=(ans2+(s[v]-w[u])*w[u] mod 10007)mod 10007; end; writeln(ans1,' ',ans2);end.
- NOIP2014联合权值——史上最强解析
- NOIP2014 联合权值
- NOIP2014联合权值
- NOIP2014联合权值
- 【noip2014】联合权值
- NOIP2014 联合权值
- 【NOIP2014】 联合权值
- noip2014联合权值
- NOIP2014 联合权值
- 【NOIP2014】联合权值
- 【NOIP2014 联合权值】
- [NOIP2014]联合权值
- NOIP2014联合权值
- [noip2014]联合权值
- 【NOIP2014提高】联合权值
- 【乱搞】noip2014联合权值
- 【NOIP2014】联合权值 乱搞
- 【NOIP2014】Day1T2 联合权值
- 本地通知
- Maven内置隐式变量
- Bjarne Stroustrup 语录
- MINIGUI学习总结一
- LintCode-带环链表 II
- NOIP2014联合权值——史上最强解析
- C++基础知识之struct和class的区别
- 前端优化总结
- 我的ROS入门(三):ubuntu-15.04-desktop-amd64配置ROS
- 浅谈多进程多线程的选择
- HDU 1978
- Subsets
- UVA 340 Master-Mind Hints
- Atom飞行手册翻译: 4.5 ~ 4.8