题目链接: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 联合权值】 题解的更多相关文章

  1. Luogu P1351 联合权值 题解

    这是一个不错的树形结构的题,由于本蒟蒻不会推什么神奇的公式其实是懒得推...,所以很愉快的发现其实只需要两个点之间的关系为祖父和儿子.或者是兄弟即可. 然后问题就变得很简单了,只需要做一个正常的DFS ...

  2. 洛谷 P1351 联合权值 题解

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

  3. luogu P1351 联合权值

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

  4. [NOIp2014] luogu P1351 联合权值

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

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

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

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

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

  7. 洛谷——P1351 联合权值

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

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

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

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

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

随机推荐

  1. 流畅的python和cookbook学习笔记(四)

    1.数字的四舍五入 对于简单的舍入运算,使用内置的 round(value, ndigits) 函数即可. round 函数返回离它最近的偶数.也就是说,对 1.5 或者 2.5 的舍入运算都会得到 ...

  2. Java 异常的处理方式--throws和try catch

    异常的第一种处理方式throws. 看以下例子: import java.io.*;public class ExceptionTest04{ public static void main(Stri ...

  3. Golang 的 TOML库

    TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner. TOML 的目标是成为一个极简的配 ...

  4. 【转】46 个非常有用的 PHP 代码片段

    1. 发送 SMS 在开发 Web 或者移动应用的时候,经常会遇到需要发送 SMS 给用户,或者因为登录原因,或者是为了发送信息.下面的 PHP 代码就实现了发送 SMS 的功能. 为了使用任何的语言 ...

  5. Open images from USB camera on linux using V4L2 with OpenCV

    I have always been using OpenCV's VideoCapture API to capture images from webcam or USB cameras. Ope ...

  6. 【Udacity笔记】What is Machine Learning?

    Teaching computers to learn to perform tasks from past experiences(recorded data) 一.Decision Tree(决策 ...

  7. javascprit form表单提交前验证以及ajax返回json

    1.今天要做一个手机验证码验证的功能.需求是前端页面点击发送 短信验证码,后台接收后通过ajax返回到前端,之后前端在提交时候进行验证.思路很简单,不过做的过程还是学到不少的东西. 1.ajax请求后 ...

  8. mongodb学习总结

    安装mongodb: 1.下载服务器最新稳定版本(选择偶数号的版本号),mongodb的版本管理偶数号为稳定版,奇数号为开发版. 2.安装时默认安装在c盘,可以选择自定义选项来改变安装路径. 3.安装 ...

  9. WebRequest的get及post提交

    static string get_html(string url) { var request = WebRequest.Create(url); var response = request.Ge ...

  10. docker images存放路径指定

    steps: 1. mkdir /home/docker(你想要docker存放image的目录) 2. systemctl stop docker 3. vi /usr/lib/systemd/sy ...