【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 点的最短距离. ... 
随机推荐
- instanceof -- JS
			在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”. ... 
- 使用 typeof 来检测对象是否undefined
			需求 判断是否为undefined 解决 使用 typeof 来检测对象是否已定义: if (typeof Obj !== "undefined" && Obj ! ... 
- python7
			字典-dict 字典也是一种组合数据,没有顺序的组合数据,数据以键值对的方式存在 字典的定义 1.创建空字符串 变量 = {} 或者 变量 = dict() 2 ... 
- Spring课程 Spring入门篇 5-6 introductions应用
			1 解析 1.1 aop:declare-parents 标签简介 1.2 标签使用样式 2 代码演练 2.1 introductions标签应用 1 解析 1.1 aop:declare-paren ... 
- 什么是APP???APP的开发类型又分哪几种???
			开发者们都知道在高端智能手机系统中有两种应用程序: 一种是基于本地(操作系统)运行的APP —-Native App: 一种是基于高端机的浏览器运行的App —-WebApp因为这些高端智能手机(Ip ... 
- Linux基础之命令练习Day1-init,who,date,cal,man,clear,passwd,su,whoami,mkdir,touch,rm,cp,mv,head,tail,more,less,echo
			开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 使用命令退出虚拟终端2上登录的用户 使用快捷键切 ... 
- android 实现类似微信缓存和即时更新好友头像
			引言 使用微信时我们会发现,首次进入微信的好友列表时,会加载好友头像,但是再次进入时,就不用重新加载了,而且其他页面都不用重新加载,说明微信的好友头像是缓存在本地的,然后好友修改头像后,又会及时的更新 ... 
- android应用js
			http://blog.csdn.net/carson_ho/article/details/64904691 通过 WebViewClient 的方法shouldOverrideUrlLoading ... 
- python三次输入错误验证登录
			# login.py# 提示用户输入用户名和密码# 验证用户名和密码# 如果v错误,则输出用户名或密码错误# 如果成功,则输出欢迎,xxxnum = 0while True: name = input ... 
- mongodb 3.4复制集配置
			1:启动三个实例 /bin/mongod --config /home/mongodb/db27017/mongodb27017.conf /bin/mongod --config /home/mon ... 
