联合权值(NOIP2014)奇特的模拟。。
这道题瞄了一眼还以为是SPFA最短路。
后面发现距离为2.。
好像可以枚举中间点来着?
时间效率O(n*(2n-2))≈O(n^2)
BOOM!(PS:9018上过了,说明数据太水了。。)
然后我们看看能不能预处理。。
第一大和第二大可以预处理233~
然后sum(中间点的临近点的权值总和)可以预处理。。。
然后就过了?O(n)
哦,对了忘记讲算法:
最大的联合权值就是中间点的临近点的第一大*第二大。。
所有的联合权值。。
我们假设有三个点a,b,c 那么联合权值=ab+ac+ba+bc+ca+cb=a(b+c)+b(a+c)+c(a+b)=a(sum-a)+b(sum-b)+c(sum-c);
然后就可以O(n)啦!
O(∩_∩)O~~。。
下面先贴O(n^2)代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 10007
using namespace std;
int n,num=;
struct edge{
int to,next;
}g[];
int head[],sum=;
int w[];
void ins(int x1,int y1)
{
g[++num].next=head[x1];
head[x1]=num;
g[num].to=y1;
}
void addedge(int x1,int y1)
{
ins(x1,y1);
ins(y1,x1);
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
}
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
int ans1=,ans2=;
for(int i=;i<=n;i++)
{
int max1=-,max2=-;
for(int j=head[i];j;j=g[j].next)
{
int tmp=w[g[j].to];
sum+=tmp;
sum%=mod;
if(tmp>max1)
{
max2=max1;
max1=tmp;
}
else if(tmp>max2)
{
max2=tmp;
}
}
ans1=max(ans1,max1*max2);
for(int j=head[i];j;j=g[j].next)
{
ans2+=(w[g[j].to]*(sum-w[g[j].to]))%mod;
ans2%=mod;
}
sum=;
}
ans2=(ans2+mod)%mod;
printf("%d %d\n",ans1,ans2);
return ;
}
再贴O(N)代码(为啥比上面的还慢。。)
#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 10007
using namespace std;
int n,num=;
struct edge{
int to,from;
}g[];
int head[];
int w[];
int max1[],max2[];
int sum[];
void ins(int x1,int y1)
{
g[++num].to=y1;
g[num].from=x1;
}
void work(int q,int r){
if(w[q]>max1[r])
{
max2[r]=max1[r];
max1[r]=w[q];
}
else if(w[q]>max2[r]) max2[r]=w[q];
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ins(x,y);
}
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
int ans1=,ans2=;
for(int i=;i<n;i++)
{
int u=g[i].from,v=g[i].to;
sum[u]=(sum[u]+w[v])%mod;
sum[v]=(sum[v]+w[u])%mod;
work(u,v);
work(v,u);
} for(int i=;i<=n;i++)ans1=max(ans1,max1[i]*max2[i]);
for(int i=;i<n;i++)
{
int u=g[i].from,v=g[i].to;
ans2+=(w[u]*(sum[v]-w[u]))%mod;
ans2%=mod;
ans2+=(w[v]*(sum[u]-w[v]))%mod;
ans2%=mod;
}
ans2=(ans2+mod)%mod;
printf("%d %d\n",ans1,ans2);
return ;
}
联合权值(NOIP2014)奇特的模拟。。的更多相关文章
- [Luogu 1351] NOIP2014 联合权值
[Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...
- [NOIP2014] 提高组 洛谷P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- Noip2014 提高组 T2 联合权值 连通图+技巧
联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...
- NOIP2014 联合权值
2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u ...
- NOIP2014提高组第二题联合权值
还是先看题吧: 试题描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...
- 【NOIP2014提高组】联合权值
https://www.luogu.org/problem/show?pid=1351 既然是一棵树,就先转化成有根树.有根树上距离为2的点对,路径可能长下面这样: 枚举路径上的中间点X. 第一种情况 ...
- 【NOIP2014】联合权值 树上dp
题目描述 Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定 ...
- 【洛谷P1351】[NOIP2014]联合权值
联合权值 题目链接 首先,直接两重循环暴力枚举得了70分 然后发现第二重循环可以记忆化一下 记忆一下每个点的子节点的权值和.最大值. 次大值(为了处理该点的父节点权值恰好为最大值) 具体看代码 #in ...
- NOIP2014提高组 联合权值(距离为2的树形dp)
联合权值 题目描述 无向连通图 GG 有 nn 个点,n-1n−1 条边.点从 11 到 nn 依次编号,编号为 ii 的点的权值为 W_iWi,每条边的长度均为 11.图上两点 (u, v)(u, ...
随机推荐
- JRE和JDK区别
JRE: Java Runtime Environment JDK:Java Development Kit JRE顾名思义是java运行时环境, 包含了java虚拟机,java基础类库. 是使用ja ...
- 字符串的输入问题 C++
C++中,初学时最常用的输入字符的方式为cin,但是,cin是如何确定已经完成了字符串的输入了呢?由于不能通过键盘输入空字符("\0"),因此cin需要用别的方法来确定字符串的结尾 ...
- Unity Occlusion Culling 遮挡剔除研究
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52684127 作者:car ...
- 真是shi
降雨量那题,真踏马shi. 调到还有五个RE不调了. 开始以为map可水后来发现一定要二分查找一下. 这种题没啥营养,不过我发现了我ST表一处错误并打了个板子.就这点用处吧. 这几天做题太少了,每天不 ...
- Python SimpleHTTPServer简单HTTP服务器
搭建FTP,或者是搭建网络文件系统,这些方法都能够实现Linux的目录共享.但是FTP和网络文件系统的功能都过于强大,因此它们都有一些不够方便的地方.比如你想快速共享Linux系统的某个目录给整个项目 ...
- Java基础-8构造方法
一).构造方法: 在之前我们提到对象的概念以及对象的实例化等,在这里简单回顾下: Man man = new Man(); 语句创建一个对象,new可以理解成创建一个对象的关键字,通过new关键字为对 ...
- 孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2
孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第九天. 今天继续学习mongoDB的简单操作, ...
- (原)Unreal Shader模块(一): 着色创建
一.着色加载 这里说的Shader是编译后的文件或内存 源码说明 --------------------------------------------------------------- ...
- 课时34:丰富的else语句以及简洁的with语句
目录: 一.丰富的else语句 二.简洁的with语句 三.课时34课后习题及答案 *********************** 一.丰富的else语句 ********************** ...
- JavaScript里面的正则以及eval
1.eval JavaScript中的eval是Python中eval和exec的合集,既可以编译代码也可以获取返回值. eval() EvalError 执行字符串中的JavaScript代码 ...