首页 > 其他分享 >联合权值

联合权值

时间:2024-08-24 15:26:26浏览次数:9  
标签:10007 int mx2 long 联合 权值

[NOIP2014 提高组] 联合权值

题目描述

无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边。点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\),每条边的长度均为 \(1\)。图上两点 \((u, v)\) 的距离定义为 \(u\) 点到 \(v\) 点的最短距离。对于图 \(G\) 上的点对 \((u, v)\),若它们的距离为 \(2\),则它们之间会产生 \(W_v \times W_u\) 的联合权值。

请问图 \(G\) 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?

输入格式

第一行包含 \(1\) 个整数 \(n\)。

接下来 \(n-1\) 行,每行包含 \(2\) 个用空格隔开的正整数 \(u,v\),表示编号为 \(u\) 和编号为 \(v\) 的点之间有边相连。

最后 \(1\) 行,包含 \(n\) 个正整数,每两个正整数之间用一个空格隔开,其中第 \(i\) 个整数表示图 \(G\) 上编号为 \(i\) 的点的权值为 \(W_i\)。

输出格式

输出共 \(1\) 行,包含 \(2\) 个整数,之间用一个空格隔开,依次为图 \(G\) 上联合权值的最大值和所有联合权值之和。由于所有联合权值之和可能很大,输出它时要对 \(10007\) 取余。

样例 #1

样例输入 #1

5  
1 2  
2 3
3 4  
4 5  
1 5 2 3 10

样例输出 #1

20 74

提示

样例解释

本例输入的图如上所示,距离为 \(2\) 的有序点对有\((1,3)\) 、\((2,4)\) 、\((3,1)\) 、$(3,5) \(、\)(4,2)$ 、$(5,3) $。

其联合权值分别为 \(2,15,2,20,15,20\)。其中最大的是 \(20\),总和为 \(74\)。

数据说明

  • 对于 \(30\%\) 的数据,\(1 < n \leq 100\);
  • 对于 \(60\%\) 的数据,\(1 < n \leq 2000\);
  • 对于 \(100\%\) 的数据,\(1 < n \leq 2\times 10^5\),\(0 < W_i \leq 10000\)。

保证一定存在可产生联合权值的有序点对。

analysis:
这道题连dfs都不需要,只需要建立起边。第一问比较简单,对于每一个点,它的所有儿子节点中最大和次大相乘,打擂台即可。
第二问,求所有的联合权值,暴力需要n2。需要数学方式转换一下。比如一个节点的儿子是a1,a2,a3,我们希望得到(a1*a2+a1*a3+a2*a3)*2,可以发现这个结果等同于(a1+a2+a3)2-a12-a2-a^3,因此可以求出每个节点所有儿子节点的和的平方,以及平方和。注意,需要用到long long.

#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
int n, hd[200005], ans, cnt, x, y, a[200005];
long long  res;
struct Edge{
	int to, nxt;
}edge[400005];
void add(int u, int v){
	edge[++cnt].to = v;
	edge[cnt].nxt = hd[u];
	hd[u] = cnt;
}
signed main(){
	cin>>n;
	for(int i = 1; i <= n-1; i++){
		cin>>x>>y;
		add(x,y); add(y,x);
	}
	for(int i = 1; i <= n; i++) cin>>a[i];
	for(int u = 1; u <= n; u++){
		int mx1 = 0, mx2 = 0, sum1 = 0, sum2 = 0;
		for(int i = hd[u]; i; i = edge[i].nxt){
			int v = edge[i].to;
			if(a[v] > mx1) mx2 = mx1, mx1 = a[v];//这个地方没有更新mx2 
			else if(a[v] > mx2) mx2 = a[v]; 
			sum1 += a[v]%10007;
			sum2 += 1ll*a[v]*a[v]%10007;	
		}
		ans = max(ans, mx1*mx2);//没有%10007,T-T 
		res = ((res + 1ll*sum1*sum1 % 10007 - sum2) % 10007 + 10007) % 10007;
	}
	cout<<ans<<" "<<res<<endl;
	return 0;
}

标签:10007,int,mx2,long,联合,权值
From: https://www.cnblogs.com/caterpillor/p/18377804

相关文章

  • 【HW系列+技战法】内存马的Webshell联合对抗技战法
    原创BeatRex的成长记录一、技战法概述二、Webshell对抗手段2.1落地文件型Webshell检测与对抗2.1无文件型内存马检测与对抗2.3Webshell免杀对抗一、技战法概述Webshell是黑客经常使用的一种后门,其目的是获得服务器的执行操作权限,常见的Webshell编写语言为A......
  • 最大权值
    第1题   最大权值 查看测评数据信息小明在校园里种了n棵树排成一排,第i棵树有两个属性,高度h[i],价值a[i],保证每棵树的高度不同,现在学校要砍伐一些树,使得剩余的树高度单调递增,并且剩余的树价值最大,问价值最大是多少。输入格式 第一行一个整数n第二行n个整数,表示h[1]......
  • CSharp联合halcon实现模板匹配
    前言1、加载并显示图像功能。2、图像拖动缩放功能。3、绘制ROI:矩形、方向矩形、圆形、椭圆形。4、创建模板:参数修改、模板轮廓显示。5、匹配模板:参数修改、匹配轮廓显示、匹配结果显示。案例实操代码结构HalconModelSet_Ex:该目录空间下存放halcon算子相关模型(......
  • C#联合halcon实现connection后的物料上色、物料计数、物料框选
    一、效果预览二、实现步骤三、代码部分ReadImageThresholdHalconWindowShowImageRectangleDef类库GenRectanglepublicstaticvoidGenRectangle(HObjectRegion,outHObjectExternalRegion,outRectangleDefrectangleDef,boolisMargin,HWindowhWindow)......
  • SearXNG与LLM强强联合:打造用户隐私保护的智能搜索解答流程,隐私无忧,搜索无忧
    SearXNG与LLM强强联合:打造用户隐私保护的智能搜索解答流程,隐私无忧,搜索无忧SearXNG是一个免费的互联网元搜索引擎,整合了各种搜索服务的结果。用户不会被跟踪,也不会被分析。github地址:https://github.com/searxng/searxng项目地址:https://docs.searxng.org/公共实例:......
  • 权值线段树与动态开点线段树
    权值线段树(维护一段值域)用线段树维护桶实质上是维护一段值域中数字出现次数例:\(1,5,4,6,7,3,8,4,5,6\);根:\(1-8\);左儿子:\(1-4\);右儿子:\(5-8\);询问目前出现第\(k\)小数字从根节点出发,如果根节点权值\(>k\)则证明存在第\(k\)小;以此类推问:如果值域很大,线段树炸了怎......
  • 日前、日内两阶段需求响应热电综合能源联合调度研究(Matlab代码实现)
    ......
  • 日前、日内两阶段需求响应热电综合能源联合调度研究(Matlab代码实现)
    ......
  • Vue3如何使用v-model写一个多条件联合搜索
    在Vue3中,使用v-model进行多条件联合搜索通常涉及到绑定多个输入字段到组件的数据属性上,并在搜索逻辑中根据这些属性的值来过滤数据。虽然v-model本身是针对单个表单元素进行双向数据绑定的,但你可以通过结合使用多个v-model和计算属性或方法来处理多条件搜索。以下是一个简单......
  • MySQL:复杂查询(二)——联合查询02
    本篇博客接上篇,上篇已讲联合查询部分知识:MySQL:复杂查询(一)——聚合函数&分组查询&联合查询01-CSDN博客目录1、联合查询1.1外连接1.1.1右外连接RIGHTJOIN1.1.2左外连接LEFTJOIN1.2自连接1.3子查询1.3.1单行子查询1.3.2多行子查询[NOT]IN1.3.3 多列......