联合权值(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, ...
随机推荐
- python flask学习第2天 URL中两种方式传参
新创建项目 自己写个url映射到自定义的视图函数 在url中传递参数 app.py from flask import Flask app = Flask(__name__) @app.route ...
- Codeforces Round #458C DP
C. Travelling Salesman and Special Numbers time limit per test 1 second memory limit per test 256 me ...
- B1076 Wifi密码 (15分)
B1076 Wifi密码 (15分) 下面是微博上流传的一张照片:"各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B ...
- [Codeforces947D]Riverside Curio(思维)
Description 题目链接 Solution 设S[i]表示到第i天总共S[i]几个标记, 那么满足S[i]=m[i]+d[i]+1 m[i]表示水位上的标记数,d[i]表示水位下的标记数 那么 ...
- 使wlr写cnblog的博客-2 设置cnblog帐号
ref:http://www.cnblogs.com/liuxianan/archive/2013/04/13/3018732.html 使用: 打开Windows Live Writer,第一次 ...
- python开发基础之字符编码、文件处理和函数基础
字符编码 为什么要有字符编码? 字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1". 一个文件用什么编码方式存储 ...
- java实时监听日志写入kafka
目的 实时监听某目录下的日志文件,如有新文件切换到新文件,并同步写入kafka,同时记录日志文件的行位置,以应对进程异常退出,能从上次的文件位置开始读取(考虑到效率,这里是每100条记一次,可调整) ...
- django中间件CsrfViewMiddleware源码分析,探究csrf实现
Django Documentation csrf保护基于以下: 1. 一个CSRF cookie 基于一个随机生成的值,其他网站无法得到.此cookie由CsrfViewMiddleware产生.它 ...
- iOS算法笔记-快速排序-OC实现
快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...
- 《Cracking the Coding Interview》——第11章:排序和搜索——题目1
2014-03-21 20:35 题目:给定已升序排列的数组A和数组B,如果A有足够的额外空间容纳A和B,请讲B数组合入到A中. 解法:由后往前进行归并. 代码: // 11.1 Given two ...