联合权值(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, ...
随机推荐
- Linux设置下载站点
https://blog.csdn.net/jfhkd2012/article/details/50912757
- 裸机——210SD卡启动
1.通过阅读iROM_Application_note可以获取关于启动的全部信息 2.记录下代码 制作SD卡启动的代码,即添加校验和的 #include <strings.h> #incl ...
- POJ-2251 三维迷宫
题目大意:给一个三维图,可以前后左右上下6种走法,走一步1分钟,求最少时间(其实就是最短路) 分析:这里与二维迷宫是一样的,只是多了2个方向可走,BFS就行(注意到DFS的话复杂度为O(6^n)肯定会 ...
- TouTiao开源项目 分析笔记17 新闻媒体专栏
1.效果预览 1.1.要实现的效果 1.2.如何调转到新闻媒体专栏 点击右上角的用户图标. 在新闻详情页面的Fragment的菜单点击事件中触发. case R.id.action_open_medi ...
- PHP.33-TP框架商城应用实例-后台9-商品相册-修改、删除(AJAX)
商品相册图片删除 当商品删除时,把相册中的图片一并从硬盘和数据库中删除,根据商品id[因为每一张商品相片都会生成三张缩略图,所以删除时要将其缩略图一并删除] //钩子方法_before_delete: ...
- P1862 输油管道问题
P1862 输油管道问题 题目背景 听说最近石油危机 所以想到了这题 题目描述 某石油公司计划建造一条由东向西的主要输油管道.该管道要穿过一个有n口油井的油田.从每口油井都要有一条输油管道沿最短路径( ...
- ElasticSearch学习笔记(三)-- 查询
1. URISearch详解与演示 2. QueryDSL简介 3. 字段类查询简介及match-query 4. 相关性算分 5. match-phrase-query 6. query-strin ...
- 《Cracking the Coding Interview》——第18章:难题——题目5
2014-04-29 01:51 题目:你有一个文本文件,每行一个单词.给定两个单词,请找出这两个单词在文件中出现的其中一对位置,使得这两个位置的距离最短. 解法:我的思路是建立倒排索引,计算出所有单 ...
- thinkPHP 表单自动验证功能
昨天晚上我们老大叫我弄表单自动验证功能,愁了半天借鉴了好多官网的知识,才出来,诶,总之分享一下我自己的成果吧! thinkphp 在Model基类为我们定义了自动验证的函数和正则表达式,我们只需要在对 ...
- Lua2
1. 迭代器与Closure 在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置和下一次遍历时的位置. ...