【luogu P1351 联合权值】 题解
题目链接:https://www.luogu.org/problemnew/show/P1351
做了些提高组的题,不得不说虽然NOIP考察的知识点虽然基本上都学过,但是做起题来还是需要动脑子的。
题目质量很高吧,觉得出的很有水平 (除了2017 d1t1
70分:
三层枚举强制到距离为2
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 2 * 1e6 + 10;
const int mod = 10007;
struct edge{
long long from, to, next, len;
}e[maxn<<2];
long long head[maxn], cnt;
long long n, val[maxn], ans, maxx;
void add(long long u, long long v)
{
e[++cnt].from = u;
e[cnt].next = head[u];
e[cnt].to = v;
head[u] = cnt;
}
int main()
{
memset(head, -1, sizeof(head));
scanf("%lld",&n);
for(long long i = 1; i < n; i++)
{
long long u, v;
scanf("%lld%lld",&u,&v);
add(u,v);
add(v,u);
}
for(long long i = 1; i <= n; i++)
scanf("%lld",&val[i]);
/*for(long long i = 1; i <= cnt; i++)
{
cout<<i<<endl;
cout<<e[i].from<<" "<<e[i].to<<" "<<e[i].next<<endl;
}
for(long long i = 1; i <= n; i++) cout<<head[i]<<" ";cout<<"qwq"<<endl;*/
for(long long i = 1; i <= n; i++)
{
for(long long j = head[i]; j != -1; j = e[j].next)
{
for(long long k = head[e[j].to]; k != -1; k = e[k].next)
{
if(e[j].from != e[k].to)
{
//cout<<e[j].from<<" "<<e[k].to<<endl;
if(maxx < val[e[j].from] * val[e[k].to])
maxx = val[e[j].from] * val[e[k].to];
ans += val[e[j].from] * val[e[k].to] % mod;
}
}
}
}
cout<<maxx<<" "<<ans%mod;
}
100分:
每次枚举中间节点的所有儿子,再用完全平方公式倒退回去所有的2WiWj
这样做的复杂度为线性,如果强行组合所有方案是O(n^2)的
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 2 * 1e6 + 10;
const int mod = 10007;
struct edge{
long long from, to, next, len;
}e[maxn<<2];
long long head[maxn], cnt;
long long n, val[maxn], ans, maxx, totsq, totsum, fir, sec;
void add(long long u, long long v)
{
e[++cnt].from = u;
e[cnt].next = head[u];
e[cnt].to = v;
head[u] = cnt;
}
int main()
{
memset(head, -1, sizeof(head));
scanf("%lld",&n);
for(long long i = 1; i < n; i++)
{
long long u, v;
scanf("%lld%lld",&u,&v);
add(u,v);
add(v,u);
}
for(long long i = 1; i <= n; i++)
scanf("%lld",&val[i]);
for(long long i = 1; i <= n; i++)
{
fir = 0, sec = 0;
long long son1 = 0, son2 = 0;
for(long long j = head[i]; j != -1; j = e[j].next)
{
if(val[e[j].to] > fir)
{
sec = fir;
fir = val[e[j].to];
}
else if(val[e[j].to] > sec)
{
sec = val[e[j].to];
}
son1 = (son1 + val[e[j].to]) % mod;
son2 = (son2 + val[e[j].to] * val[e[j].to]) % mod;
}
if(sec == 0) continue;
if(maxx < fir * sec)
maxx = fir * sec;
son1 = son1 * son1 % mod;
ans = (ans + son1 - son2 + 10007)%10007;
}
printf("%lld %lld",maxx, ans);
return 0;
}
【luogu P1351 联合权值】 题解的更多相关文章
- Luogu P1351 联合权值 题解
这是一个不错的树形结构的题,由于本蒟蒻不会推什么神奇的公式其实是懒得推...,所以很愉快的发现其实只需要两个点之间的关系为祖父和儿子.或者是兄弟即可. 然后问题就变得很简单了,只需要做一个正常的DFS ...
- 洛谷 P1351 联合权值 题解
P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\),每条 ...
- luogu P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- [NOIp2014] luogu P1351 联合权值
哎我博 4 了. 题目描述 无向连通图 GGG 有 nnn 个点,n−1n−1n−1 条边.点从 111 到 nnn 依次编号,编号为 iii 的点的权值为 WiW_iWi,每条边的长度均为 111 ...
- P1351 联合权值(树形dp)
P1351 联合权值 想刷道水题还交了3次.....丢人 (1.没想到有两个点都是儿子的状况 2.到处乱%(大雾)) 先dfs一遍处理出父亲$fa[x]$ 蓝后再一遍dfs,搞搞就出来了. #incl ...
- 『题解』洛谷P1351 联合权值
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...
- 洛谷——P1351 联合权值
https://www.luogu.org/problem/show?pid=1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i , ...
- P1351 联合权值[鬼畜解法]
题目描述 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v 点的最短距离 ...
- [NOIP2014] 提高组 洛谷P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
随机推荐
- IntelliJ IDEA 快捷键(一)(window版)
一.高效定位代码 1.跳转 1.项目之间的跳转 Next Project Window 快捷键 Ctrl + Alt + 左方括号. Previous Project Window 快捷键 Ctrl ...
- Java类加载器ClassLoader总结
JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中. 2.显式装载, 通过class.forname()等方法,显 ...
- mac通过wine运行windows程序(将文件关联到windows程序notepad++)
windows程序功能强大且已经习惯使用了,用mac总感觉不给力,例如记事本工具Notepad++就非常优秀.下面介绍如何在mac系统下通过wine来安装使用notepadd++程序. 1.安装win ...
- Heka 的 CMake 编译配置分析
CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件. CMakeLists.txt 的语法比较简单,由命令.注释和 ...
- 编写简单的maven插件
编写一个简单的输出maven的hello world的插件 1.在eclipse中新建一个maven project项目 然后取名HelloPlugin,建立后,pom文件为(注意packaging为 ...
- IO流之 commons-IO
commons-IO 导入classpath 加入classpath的第三方jar包内的class文件才能在项目中使用 创建lib文件夹 将commons-io.jar拷贝到lib文件夹 右键点击co ...
- IO流之打印流
打印流的概述(只有输出就是只与数据目的有关,不会抛出IO异常) 打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式. 打印流根据流的分类: l 字节打印流 PrintStream l ...
- cf1043F. Make It One(dp 容斥原理)
题意 题目链接 给出\(n\)个数,问最少选几个数,使他们的\(gcd = 1\) Sol 好神仙啊qwq. 首先,如果答案存在,那么最多为\(7\)(因为前\(7\)个质数乘起来\(>= 3e ...
- 2013年未之wpf项目乱述
不知识为何现已很少在网上发帖,貌似人生的方向已经看的七七八八.要么用心工作,要么自主创业.无论怎么样,对于现在的我来说都是一种淡定的选择.作为一个c#程序员,今年下半年开始使用wpf,更觉得wpf将来 ...
- GetVersion和GetVersionEx
原文:http://www.cnblogs.com/VOIP/archive/2011/03/22/1990927.html Windows API 中有两个函数可以得到系统版本信息:GetVersi ...