[NOIp2014] luogu P1351 联合权值
2024-08-27 13:34:19
哎我博 4 了。
题目描述
无向连通图 GGG 有 nnn 个点,n−1n−1n−1 条边。点从 111 到 nnn 依次编号,编号为 iii 的点的权值为 WiW_iWi,每条边的长度均为 111。图上两点 (u,v)(u,v)(u,v) 的距离定义为 uuu 点到 vvv 点的最短距离。对于图 GGG 上的点对 (u,v)(u, v)(u,v),若它们的距离为 222,则它们之间会产生 Wv×WuW_v \times W_uWv×Wu 的联合权值。
请问图 GGG 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?
Solution
枚举每个点,发现我所有的儿子,两两距离都为 222。这样我们就设计出了线性算法。
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int MAXN=200010;
struct node{
int x,y,next;
}e[MAXN+MAXN+10];
int len=0;
int first[MAXN];
int n,sx,sy;
int a[MAXN];
void ins(int x,int y){
e[++len].x=x;e[len].y=y;
e[len].next=first[x];first[x]=len;
}
int max(int x,int y){
return x>y?x:y;
}
inline int read(){
int x=0; char c;
do c=getchar(); while(c<'0'||c>'9');
while(c>='0'&&c<='9')
x=x*10+c-48,c=getchar();
return x;
}
int main(){
n=read();
for(int i=1;i<n;++i){
sx=read();sy=read();
ins(sx,sy);ins(sy,sx);
}
for(int i=1;i<=n;++i)
a[i]=read();
int sum=-1,ans=0;
for(int i=1;i<=n;++i){
int cnt=0,cm=0;
for(int j=first[i];j;j=e[j].next){
int y=e[j].y;
ans=(ans+cnt*a[y])%10007;
//坑点,取模
cnt=(cnt+a[y])%10007;
sum=max(sum,cm*a[y]);
cm=max(cm,a[y]);
}
}
printf("%d %d",sum,(ans+ans)%10007);
}
最新文章
- C# 字符编码类Encoding
- 旧项目如何切换到Entity Framework Code First
- javac 编译与 JIT 编译
- [转]Setup-Subversion-1.6.5+TortoiseSVN-v1.6.5
- 用node开发repl应用
- (二)我的Makefile学习冲动&;&;编译过程概述
- 配置Linux任务计划
- Extjs ajax form 提交
- Java使用泛型类来提高方法的可重用性
- Jquery插件-Html5图片上传并裁剪
- 数据结构&mdash;&mdash;左高树
- 蓝牙协议 基于TI cc2540 模块的理解(转)
- 主成分分析、实例及R语言原理实现
- EasyPR源码剖析(5):车牌定位之偏斜扭转
- c++ 格式字符串说明
- 桥接模式-pattern系列
- JSP—作用域
- [JavaScript] - form表单转json的插件
- SQL思维导图
- CF 700 E. Cool Slogans