原题传送门

这道题瞄了一眼还以为是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)代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 10007
using namespace std;
int n,num=;
struct edge{
int to,next;
}g[];
int head[],sum=;
int w[];
void ins(int x1,int y1)
{
g[++num].next=head[x1];
head[x1]=num;
g[num].to=y1;
}
void addedge(int x1,int y1)
{
ins(x1,y1);
ins(y1,x1);
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
}
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
int ans1=,ans2=;
for(int i=;i<=n;i++)
{
int max1=-,max2=-;
for(int j=head[i];j;j=g[j].next)
{
int tmp=w[g[j].to];
sum+=tmp;
sum%=mod;
if(tmp>max1)
{
max2=max1;
max1=tmp;
}
else if(tmp>max2)
{
max2=tmp;
}
}
ans1=max(ans1,max1*max2);
for(int j=head[i];j;j=g[j].next)
{
ans2+=(w[g[j].to]*(sum-w[g[j].to]))%mod;
ans2%=mod;
}
sum=;
}
ans2=(ans2+mod)%mod;
printf("%d %d\n",ans1,ans2);
return ;
}

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

#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 10007
using namespace std;
int n,num=;
struct edge{
int to,from;
}g[];
int head[];
int w[];
int max1[],max2[];
int sum[];
void ins(int x1,int y1)
{
g[++num].to=y1;
g[num].from=x1;
}
void work(int q,int r){
if(w[q]>max1[r])
{
max2[r]=max1[r];
max1[r]=w[q];
}
else if(w[q]>max2[r]) max2[r]=w[q];
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ins(x,y);
}
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
int ans1=,ans2=;
for(int i=;i<n;i++)
{
int u=g[i].from,v=g[i].to;
sum[u]=(sum[u]+w[v])%mod;
sum[v]=(sum[v]+w[u])%mod;
work(u,v);
work(v,u);
} for(int i=;i<=n;i++)ans1=max(ans1,max1[i]*max2[i]);
for(int i=;i<n;i++)
{
int u=g[i].from,v=g[i].to;
ans2+=(w[u]*(sum[v]-w[u]))%mod;
ans2%=mod;
ans2+=(w[v]*(sum[u]-w[v]))%mod;
ans2%=mod;
}
ans2=(ans2+mod)%mod;
printf("%d %d\n",ans1,ans2);
return ;
}

联合权值(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. [CQOI2007]余数求和 (分块+数学

    题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如G(10, 5)=5 ...

  2. POJ:1064-Cable master

    Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 58613 Accepted: 12231 Descri ...

  3. 笔记-select,poll,epoll

    笔记-select,poll,epoll 1.      I/O多路复用 I/O多路复用是指:通过一种机制或一个进程,可以监视多个文件描述符,一旦描述符就绪(写或读),能够通知程序进行相应的读写操作. ...

  4. python基础之内置函数补充、匿名函数、递归函数

    内置函数补充 python divmod()函数:把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b) 语法: 1 divmod(a, b) #a.b为数字,a为除数 ...

  5. 15.4,redis不重启,切换RDB备份到AOF备份

      确保redis版本在2.2以上 [root@pyyuc /data ::]#redis-server -v Redis server v= sha=: malloc=jemalloc- bits= ...

  6. VHDL语法入门学习第一篇

    1. 现在先遇到一个VHDL的语法问题,以前没用过VHDL,现在要去研究下,进程(PROCESS) 进程内部经常使用IF,WAIT,CASE或LOOP语句.PROCESS具有敏感信号列表(sensit ...

  7. cycling -avoid the vicious cycle

    ‘Numerous' studies in the past appear to have shown a link between cycling and ED. The researchers a ...

  8. 《Cracking the Coding Interview》——第8章:面向对象设计——题目3

    2014-04-23 18:10 题目:设计一个点唱机. 解法:英文叫Musical Jukebox.这是点唱机么?卡拉OK么?这种题目实在是云里雾里,又没有交流的余地,我索性用一个vector来表示 ...

  9. 【vim环境配置】详细实录

    [写在前面] 以下的所有内容主要参照: https://github.com/yangyangwithgnu/use_vim_as_ide . 原blog作者写的非常用心,建议大家都去看看.(个人觉得 ...

  10. ACM二分搜索算法

    二分搜索算法就是把要搜索的数据在搜索文本中根据情况进行折半,比如要在2 6 4 9 3 8 7 3 5中找到找到4的位置,那么可以考虑先把数据进行排序,然后把拍好后的数据的中间的那个数据和要查找的数据 ...