Problem

P1351 【联合权值】

record

  • 用时: 99ms
  • 空间: 13068KB(12.76MB)
  • 代码长度: 3.96KB
  • 提交记录: R9883701
  • 注: 使用了
    1. o1 优化
    2. o2 优化
    3. o3 优化
    4. use-v4
    5. 快读快输

Solution

60 or 70 pts

直接爆搜,枚举每两个距离为 2 的点,然后记录答案。

写法优异可以拿走 70 pts , 但是 use-v4 几乎铁定是 60 pts 。

代码。。。就不放了,有兴趣的可以看:

60 pts(use-v4)

70 pts(use-v3)

70⇒100 pts

考虑我们的思路慢在哪儿?

在于组合!

考虑一个菊花图,复杂度几乎是 Θ(n^2) 的,当然慢。

想到乘法交换律(数学老师不要怪我这么长时间才想起你)

这时候考虑任意两个距离为 2 的有序点对一定会有一个中间点,枚举这个点即可,并不需要搜索。复杂度 Θ(n)Θ(n) ,菊花图不会卡

100 pts

思路基本没什么问题了吧!

等等,图 G 上联合权值的最大值呢?

每次记录中间点相邻点中最大的和次大的即可。

没问题了吧?

不,还有问题!

答案要乘 2 !

因为题目可以看成一对有序点对要计算两次。

Code

 // luogu-judger-enable-o2
/*
Problem: P1351 联合权值
Author: 航空信奥
Date: 2018/08/18
Upload: Luogu
P.s.: use-v4
*/
#pragma GCC optimize("O1")
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std; namespace AuthorName { /* 防重名 */
template <typename _TpInt> inline _TpInt read();
template <typename _TpInt> inline void write(_TpInt x); # define Online_Judge
# define Max_N
# define Mod vector<vector<int> > g;
int *w;
int maxx = , sum = ; void work(int p)
{
int max_1st = , max_2nd = , temp_sum = ;
for (size_t i = ; i < g[p].size(); i++) {
if (w[g[p][i]] > max_1st) {
max_2nd = max_1st;
max_1st = w[g[p][i]];
}
else if (w[g[p][i]] > max_2nd) {
max_2nd = w[g[p][i]];
}
sum = (sum + temp_sum * w[g[p][i]]) % Mod;
temp_sum = (temp_sum + w[g[p][i]]) % Mod;
}
maxx = max(maxx, max_1st * max_2nd);
} int main()
{
int n;
n = read<int>();
g.resize(n + );
w = new int[n + ];
int u, v;
for (int i = ; i < n; i++) {
u = read<int>();
v = read<int>();
g[u].push_back(v);
g[v].push_back(u);
}
for (int i = ; i <= n; i++) {
w[i] = read<int>();
}
for (int i = ; i <= n; i++) {
work(i);
} write(maxx), putchar(), write((sum << ) % Mod), putchar(); return ;
} #ifdef Online_Judge
char BufferRead[ << ];
int rLen = , rPos = ;
inline char Getchar()
{
if (rPos == rLen) rPos = , rLen = fread(BufferRead, , << , stdin);
if (rPos == rLen) return EOF;
return BufferRead[rPos++];
}
#else
# define Getchar() getchar()
#endif template <typename _TpInt>
inline _TpInt read()
{
register int flag = ;
register char c = Getchar();
while ((c > '' || c < '') && c != '-')
c = Getchar();
if (c == '-') flag = -, c = Getchar();
register _TpInt init = (c & );
while ((c = Getchar()) <= '' && c >= '')
init = (init << ) + (init << ) + (c & );
return init * flag;
} template <typename _TpInt>
inline void write(_TpInt x)
{
if (x < ) {
putchar('-');
write<_TpInt>(~x + );
}
else {
if (x > ) write<_TpInt>(x / );
putchar(x % + '');
}
}
} int main()
{
AuthorName::main();
return ;
}

洛谷 题解 P1351 【联合权值】的更多相关文章

  1. 洛谷 P1351 联合权值 题解

    P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\)​,每条 ...

  2. P1351 联合权值(树形dp)

    P1351 联合权值 想刷道水题还交了3次.....丢人 (1.没想到有两个点都是儿子的状况 2.到处乱%(大雾)) 先dfs一遍处理出父亲$fa[x]$ 蓝后再一遍dfs,搞搞就出来了. #incl ...

  3. 『题解』洛谷P1351 联合权值

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...

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

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

  5. 洛谷 P1351 联合权值

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

  6. 洛谷——P1351 联合权值

    https://www.luogu.org/problem/show?pid=1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i , ...

  7. P1351 联合权值[鬼畜解法]

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

  8. luogu P1351 联合权值

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

  9. [NOIp2014] luogu P1351 联合权值

    哎我博 4 了. 题目描述 无向连通图 GGG 有 nnn 个点,n−1n−1n−1 条边.点从 111 到 nnn 依次编号,编号为 iii 的点的权值为 WiW_iWi​,每条边的长度均为 111 ...

随机推荐

  1. [综合] ISE的综合结果

    1.count2 == 7‘d12,会被综合成下面这个样子, 7‘d12就是左边下面这根绿线,等于符号在中间的圆圈里. 2.什么线都不点的时候,也就什么也没被选中, 而一旦我点击了某根线,却发现图里到 ...

  2. [ERROR]Unable to locate package

    刚更换了DNS,需要更新下apt-get $ apt-get update

  3. ThinkPHP 怎样让URL访问的时候省略 index.php

    ThinkPHP 怎样让URL访问的时候省略 index.php Nginx 服务器配置 修改 nginx.conf 文件 location / { // …..省略部分代码 if (!-e $req ...

  4. java 中的 shuffle()用于打乱list中的元素

    题目描述: 数组里面有{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},请随机打乱顺序生成新的数组: import java.util.ArrayList; import java.ut ...

  5. Linux进程管理(ps、pstree、top、pidof、kill、nice、free)

    进程号(Process ID,PID) 1.ps命令(process status) 无选项时只显示从当前终端当前用户的进程 ps aux 是用BSD的格式来显示 java这个进程显示的项目有:USE ...

  6. window系统下删除多余的引导

    window系统下删除多余的引导 1.首先第一步进入EFI分区删除多余系统引导,只留下需要的引导 如何进入EFI分区 a)win 搜索框输入cm, 右键以管理员运行命令行 b)输入命令 diskpar ...

  7. goland学习-go常用命令使用

    goland学习-go常用命令使用 1.跨平台编译:env GOOS=linux GOARCH=amd64 go build 2.获取go第三方包:go get -u github.com/go-sq ...

  8. 基于 HTML5 WebGL 和 VR 技术的 3D 机房数据中心可视化

    前言 在 3D 机房数据中心可视化应用中,随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的 ...

  9. Selenium网页自动登录项目(基于Python从0到1)

    Selenium是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,如点击.下拉等操作. 本文讲述的是通过自动化的方式登陆某一网站,其中包含Selenium+python自动化项目环境如何部 ...

  10. Java求吸血鬼数算法(通用)

    /*吸血鬼数字是指位数为偶数的数字,可以由一 * 对数字相乘而得到,而这对数字各包含乘积的一半位数的数字, * 其中从最初的数字中选取的数字可以任意排序. * 以两个0结尾的数字是不允许的. * * ...