NOIp 2014 联合权值 By cellur925
这题自己(真正)思考了很久(欣慰)。
(轻而易举)地发现这是一棵树后,打算从Dfs序中下功夫,推敲了很久规律,没看出来(太弱了)。
开始手动枚举距离为2的情况,模模糊糊有了一些概念,但没有总结。(敲黑板:题目中发现规律与重要性质注意总结!)
其实,距离为2的情况只有两种:祖父/兄弟。
一个小时后放弃治疗。开始想暴力,很好想,我们对于每个点,枚举他的出边,再在每个出边中的出边中进行枚举,储存距离为2 的点。期望得分60pts.
大力交了一下:40pts,AC*6,WA*2,MLE*4.
MLE还有情可缘,vector开动态数组可能炸了,WA的那两个喵喵喵?
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector> using namespace std;
typedef long long ll; int n,tot;
ll sum,ans,p=;
int head[];
ll val[];
bool vis[];
struct node{
int to,next;
}edge[];
vector<int>law[]; void add(int x,int y)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} void dfs(int u)
{
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
for(int j=head[v];j;j=edge[j].next)
{
int g=edge[j].to;
if(g==u) continue;
law[u].push_back(g);
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n-;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=;i<=n;i++) scanf("%d",&val[i]);
// dfs_pre(1);
// memset(vis,0,sizeof(vis));
// dfs(1,0);
for(int i=;i<=n;i++)
dfs(i);
for(int i=;i<=n;i++)
{
for(int j=;j<law[i].size();j++)
{
int u=i,v=law[i][j];
ll tmp=val[u]%p*val[v]%p;
(sum+=tmp)%=p;
(ans=max(ans,tmp))%=p;
}
}
printf("%lld %lld",ans,sum);
return ;
}
后来经过冷静分析看题解发现并不需要存儿子,当时每次更新一下就行了。而且最大值并不需要取膜。
再交一下60pts。TLE4个点,正常。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector> using namespace std;
typedef long long ll; int n,tot;
ll sum,ans,p=;
int head[];
ll val[];
struct node{
int to,next;
}edge[]; void add(int x,int y)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} void dfs(int u)
{
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
for(int j=head[v];j;j=edge[j].next)
{
int g=edge[j].to;
if(g==u) continue;
ans=max(ans,val[u]*val[g]);
(sum+=val[u]*val[g])%=p;
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n-;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=;i<=n;i++) scanf("%d",&val[i]);
// dfs_pre(1);
// memset(vis,0,sizeof(vis));
// dfs(1,0);
for(int i=;i<=n;i++)
dfs(i);
printf("%lld %lld",ans,sum);
return ;
}
正解:我们只需要枚举每个点与他相连的每一条边即可,统计出与每个点相邻的最大点值与次大点值,全局最值用(最大点值*次大点值)更新,全局和用“乘法分配律“”维护。
#include<cstdio>
#include<algorithm> using namespace std;
typedef long long ll; int n,tot;
ll p=,sum,ans;
int head[],val[];
struct node{
int to,next;
}edge[]; void add(int x,int y)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} ll llmax(ll a,ll b)
{
if(a>=b) return a;
else return b;
} void update(int x)
{
int maxx=,maxs=;
ll cnt=;
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(val[y]>maxx) maxs=maxx,maxx=val[y];
else if(val[y]>maxs) maxs=val[y];
(sum+=cnt*val[y])%=p;
(cnt+=val[y])%=p;
}
ans=llmax(ans,maxs*maxx);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n-;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=;i<=n;i++) scanf("%d",&val[i]);
for(int i=;i<=n;i++) update(i);
printf("%lld %lld",ans,*sum%p);
return ;
}
NOIp 2014 联合权值 By cellur925的更多相关文章
- Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)
Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...
- [NOIp 2014]联合权值
Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v ...
- NOIP 提高组 2014 联合权值(图论???)
传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 题解: 相关变量解释: int n; int fa[maxn];//fa[i] : i的 ...
- 题解【luoguP1351 NOIp提高组2014 联合权值】
题目链接 题意:给定一个无根树,每个点有一个权值.若两个点 \(i,j\) 之间距离为\(2\),则有联合权值 \(w_i \times w_j\).求所有的联合权值的和与最大值 分析: 暴力求,每个 ...
- NOIP 2004 联合权值
洛谷 P1351 联合权值 洛谷传送门 JDOJ 2886: [NOIP2014]联合权值 D1 T2 JDOJ传送门 Description 无向连通图 G有 n个点,n-1条边.点从 1到 n依次 ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- NOIP 2014 T2 联合权值 DFS
背景 NOIP2014提高组第二题 描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对 ...
- Codevs 3728 联合权值
问题描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每 条边的长度均为1.图上两点(u,v)的距离定义为u点到v点的最短距离.对于图G上的点 对(u,v),若它 ...
- P1906联合权值
描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离. ...
随机推荐
- 【Java源码】集合类-优先队列PriorityQueue
一.类继承关系 public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serial ...
- Linux查看日志三种命令(转载)
第一种:查看实时变化的日志(比较吃内存) 最常用的: tail -f filename (默认最后10行,相当于增加参数 -n 10) Ctrl+c 是退出tail命令 其他情况: tail -n 2 ...
- Spring错误异常重试框架guava-retrying
官网:https://github.com/rholder/guava-retrying Maven:https://mvnrepository.com/artifact/com.github.rho ...
- JVM监控工具:jps、jstat、jinfo、jmap、jhat、jstack使用介绍
转载:http://outofmemory.cn/java/jvm/jvm-tools-jps-jstat-jinfo-jmap-jhat-jstack 一.jps(JVM Process Statu ...
- SeaGlass:手工搭建伪基站监控系统
“伪基站”即假基站,设备一般由主机和笔记本电脑或手机组成,通过短信群发器.短信发信机等相关设备能够搜取以其为中心.一定半径范围内的手机卡信息,利用2G移动通信的缺陷,通过伪装成运营商的基站,冒用他人手 ...
- css 滤镜之Gradient
CreateTime--2017年12月26日11:09:14 Author:Marydon ie滤镜特效之Gradient 作用: 用于设置渐变背景色 使用条件: IE9及以下版本不支持属性ba ...
- 一个Exchange 2010 的password不定期弹框的问题处理,希望对大家可以有所帮助。
前期有个客户採用exchange 2010的邮件系统作为他们的邮件平台.有个奇怪的现象就是Exchange 2010 系统会出现不定期"宕机"现象,为何打上引號,就是这个时候仅仅有 ...
- 初探active mq
mq(message queue),即消息队列,目前比较流行消息队列是active mq 和kafka.本文介绍如何简单的使用active mq. ActiveMQ官网下载地址:http://acti ...
- Xcode The identity used to sign the executable is no longer valid. 错误解决
Xcode真机调试时出现问题:Xcode The identity used to sign the executable is no longer valid. Please verify that ...
- PP-生产订单状态
转自:http://www.cnblogs.com/mingdashu/p/5566108.html SAP系统的常见订单状态如下: · CRTD (创建):标识生产订单刚刚创建,此时禁 ...