联合权值(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, ...
随机推荐
- Teaching Is a Fruitful Way to Learn【教学是一种有效的学习方式】
Teaching Is a Fruitful Way to Learn For thousands of years, people have known that the best way to u ...
- 对于STM32别名区的理解 (转载)
1. 什么是位段.位带别名区? 2. 它有什么好处? 答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作, MCS51可以简单的将P1口的第2位 ...
- hadoop中节点上的nodemanager一直启动不起来
当我们启动Hadoop集群的时候,发现有一台机器的nodemanager启动后自动关闭, 查看日志的时候发现有错误:yarn-root-nodemanager-log 解决办法: netstat a ...
- luogu3343 [ZJOI2015]地震后的幻想乡
ref 前置技能是bzoj的串珠子.这种子集dp好神啊qwq. 还有这种钦定点转移子集的方法建议按这题的方法写,不要看串珠子qwq #include <iostream> #include ...
- 剑指Offer - 九度1386 - 旋转数组的最小数字
剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...
- 《Cracking the Coding Interview》——第11章:排序和搜索——题目3
2014-03-21 20:55 题目:给定一个旋转过的升序排序好的数组,不知道旋转了几位.找出其中是否存在某一个值. 解法1:如果数组的元素都不重复,那么我的解法是先找出旋转的偏移量,然后进行带偏移 ...
- 课时2:用python设计第一个游戏
目录: 一.第一个小游戏 二.缩进 三.BIF 四.课时02课后习题及答案 ********************* 一.第一个小游戏 ********************* # p2_1.py ...
- CentOS6.5下搭建LAMP环境(源码编译方式)
CentOS 6.5安装配置LAMP服务器(Apache+PHP5+MySQL) 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP ,WAMP,MAMP等.这里我介 ...
- css深入理解relative
第一讲 relative和absolute相煎关系 同源性 .position:relative .position:absolute 限制作用 1.限制left/top/right/bott ...
- jquery实现各种实例
1.正反选实例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...