ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

noip2014联合权值

2019-07-18 22:36:19  阅读:248  来源: 互联网

标签:do begin noip2014 end max2 ans2 max1 联合 权值


原文链接:http://www.cnblogs.com/cxvdzxhb/p/4510452.html

http://codevs.cn/problem/3728/

我们要做的是计算距离为2的有序对权值之和及最大值,最大值好弄,但一一枚举是不可行的,因为n<=200000,我们可以预处理一下,每次读入边的时候我们把与当前顶点有边相连的所有点的权值中的最大值及次大值保存起来,然后用个O(n)时间就可以计算出来。至于权值和,我们可以这样,用s[i]存储与节点i相连的节点的权值和,枚举每条边(u,v),sigma((s[u]-w[v])*w[v]+(s[v]-w[u])*w[u])mod 1007 即是答案。

 

 

type
  edge=record
    u,v:longint;
  end;
var
 n,i,j,ans1,ans2,u,v:longint;
 s:array[1..200000]of int64;
 w,max1,max2:array[1..200000]of longint;
 e:array[1..200000]of edge;
procedure work(x:longint;var a,b:longint);
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]);
    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.

 

 

转载于:https://www.cnblogs.com/cxvdzxhb/p/4510452.html

标签:do,begin,noip2014,end,max2,ans2,max1,联合,权值
来源: https://blog.csdn.net/weixin_30868855/article/details/96460633

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有