原题传送门

这道题瞄了一眼还以为是SPFA最短路。

后面发现距离为2.。

好像可以枚举中间点来着?

时间效率O(n*(2n-2))≈O(n^2)

BOOM!(PS:9018上过了,说明数据太水了。。)

然后我们看看能不能预处理。。

第一大和第二大可以预处理233~

然后sum(中间点的临近点的权值总和)可以预处理。。。

然后就过了?O(n)

哦,对了忘记讲算法:

最大的联合权值就是中间点的临近点的第一大*第二大。。

所有的联合权值。。

我们假设有三个点a,b,c 那么联合权值=ab+ac+ba+bc+ca+cb=a(b+c)+b(a+c)+c(a+b)=a(sum-a)+b(sum-b)+c(sum-c);

然后就可以O(n)啦!

O(∩_∩)O~~。。

下面先贴O(n^2)代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define mod 10007
  5. using namespace std;
  6. int n,num=;
  7. struct edge{
  8. int to,next;
  9. }g[];
  10. int head[],sum=;
  11. int w[];
  12. void ins(int x1,int y1)
  13. {
  14. g[++num].next=head[x1];
  15. head[x1]=num;
  16. g[num].to=y1;
  17. }
  18. void addedge(int x1,int y1)
  19. {
  20. ins(x1,y1);
  21. ins(y1,x1);
  22. }
  23. int main(){
  24. scanf("%d",&n);
  25. for(int i=;i<n;i++)
  26. {
  27. int x,y;
  28. scanf("%d%d",&x,&y);
  29. addedge(x,y);
  30. }
  31. for(int i=;i<=n;i++)
  32. scanf("%d",&w[i]);
  33. int ans1=,ans2=;
  34. for(int i=;i<=n;i++)
  35. {
  36. int max1=-,max2=-;
  37. for(int j=head[i];j;j=g[j].next)
  38. {
  39. int tmp=w[g[j].to];
  40. sum+=tmp;
  41. sum%=mod;
  42. if(tmp>max1)
  43. {
  44. max2=max1;
  45. max1=tmp;
  46. }
  47. else if(tmp>max2)
  48. {
  49. max2=tmp;
  50. }
  51. }
  52. ans1=max(ans1,max1*max2);
  53. for(int j=head[i];j;j=g[j].next)
  54. {
  55. ans2+=(w[g[j].to]*(sum-w[g[j].to]))%mod;
  56. ans2%=mod;
  57. }
  58. sum=;
  59. }
  60. ans2=(ans2+mod)%mod;
  61. printf("%d %d\n",ans1,ans2);
  62. return ;
  63. }

再贴O(N)代码(为啥比上面的还慢。。)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define mod 10007
  5. using namespace std;
  6. int n,num=;
  7. struct edge{
  8. int to,from;
  9. }g[];
  10. int head[];
  11. int w[];
  12. int max1[],max2[];
  13. int sum[];
  14. void ins(int x1,int y1)
  15. {
  16. g[++num].to=y1;
  17. g[num].from=x1;
  18. }
  19. void work(int q,int r){
  20. if(w[q]>max1[r])
  21. {
  22. max2[r]=max1[r];
  23. max1[r]=w[q];
  24. }
  25. else if(w[q]>max2[r]) max2[r]=w[q];
  26. }
  27. int main(){
  28. scanf("%d",&n);
  29. for(int i=;i<n;i++)
  30. {
  31. int x,y;
  32. scanf("%d%d",&x,&y);
  33. ins(x,y);
  34. }
  35. for(int i=;i<=n;i++)
  36. scanf("%d",&w[i]);
  37. int ans1=,ans2=;
  38. for(int i=;i<n;i++)
  39. {
  40. int u=g[i].from,v=g[i].to;
  41. sum[u]=(sum[u]+w[v])%mod;
  42. sum[v]=(sum[v]+w[u])%mod;
  43. work(u,v);
  44. work(v,u);
  45. }
  46.  
  47. for(int i=;i<=n;i++)ans1=max(ans1,max1[i]*max2[i]);
  48. for(int i=;i<n;i++)
  49. {
  50. int u=g[i].from,v=g[i].to;
  51. ans2+=(w[u]*(sum[v]-w[u]))%mod;
  52. ans2%=mod;
  53. ans2+=(w[v]*(sum[u]-w[v]))%mod;
  54. ans2%=mod;
  55. }
  56. ans2=(ans2+mod)%mod;
  57. printf("%d %d\n",ans1,ans2);
  58. return ;
  59. }

联合权值(NOIP2014)奇特的模拟。。的更多相关文章

  1. [Luogu 1351] NOIP2014 联合权值

    [Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...

  2. [NOIP2014] 提高组 洛谷P1351 联合权值

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  3. Noip2014 提高组 T2 联合权值 连通图+技巧

    联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...

  4. NOIP2014 联合权值

    2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u ...

  5. NOIP2014提高组第二题联合权值

    还是先看题吧: 试题描述  无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...

  6. 【NOIP2014提高组】联合权值

    https://www.luogu.org/problem/show?pid=1351 既然是一棵树,就先转化成有根树.有根树上距离为2的点对,路径可能长下面这样: 枚举路径上的中间点X. 第一种情况 ...

  7. 【NOIP2014】联合权值 树上dp

    题目描述 Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i   ,每条边的长度均为1 .图上两点( u ,  v ) 的距离定 ...

  8. 【洛谷P1351】[NOIP2014]联合权值

    联合权值 题目链接 首先,直接两重循环暴力枚举得了70分 然后发现第二重循环可以记忆化一下 记忆一下每个点的子节点的权值和.最大值. 次大值(为了处理该点的父节点权值恰好为最大值) 具体看代码 #in ...

  9. NOIP2014提高组 联合权值(距离为2的树形dp)

    联合权值 题目描述 无向连通图 GG 有 nn 个点,n-1n−1 条边.点从 11 到 nn 依次编号,编号为 ii 的点的权值为 W_iWi​,每条边的长度均为 11.图上两点 (u, v)(u, ...

随机推荐

  1. Teaching Is a Fruitful Way to Learn【教学是一种有效的学习方式】

    Teaching Is a Fruitful Way to Learn For thousands of years, people have known that the best way to u ...

  2. 对于STM32别名区的理解 (转载)

    1. 什么是位段.位带别名区? 2. 它有什么好处? 答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,       MCS51可以简单的将P1口的第2位 ...

  3. hadoop中节点上的nodemanager一直启动不起来

    当我们启动Hadoop集群的时候,发现有一台机器的nodemanager启动后自动关闭, 查看日志的时候发现有错误:yarn-root-nodemanager-log 解决办法: netstat  a ...

  4. luogu3343 [ZJOI2015]地震后的幻想乡

    ref 前置技能是bzoj的串珠子.这种子集dp好神啊qwq. 还有这种钦定点转移子集的方法建议按这题的方法写,不要看串珠子qwq #include <iostream> #include ...

  5. 剑指Offer - 九度1386 - 旋转数组的最小数字

    剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...

  6. 《Cracking the Coding Interview》——第11章:排序和搜索——题目3

    2014-03-21 20:55 题目:给定一个旋转过的升序排序好的数组,不知道旋转了几位.找出其中是否存在某一个值. 解法1:如果数组的元素都不重复,那么我的解法是先找出旋转的偏移量,然后进行带偏移 ...

  7. 课时2:用python设计第一个游戏

    目录: 一.第一个小游戏 二.缩进 三.BIF 四.课时02课后习题及答案 ********************* 一.第一个小游戏 ********************* # p2_1.py ...

  8. CentOS6.5下搭建LAMP环境(源码编译方式)

    CentOS 6.5安装配置LAMP服务器(Apache+PHP5+MySQL) 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP ,WAMP,MAMP等.这里我介 ...

  9. css深入理解relative

    第一讲     relative和absolute相煎关系 同源性 .position:relative .position:absolute 限制作用 1.限制left/top/right/bott ...

  10. jquery实现各种实例

    1.正反选实例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...