codevs3728联合权值(LCA)







/*
自己打暴力,看了看不用打LCA只处理倍增数组
然后就10分了......
神奇的LCA 估计打了能有60分
只能看峰峰...
*/ #include<iostream>
#include<cstdio>
#include<cstdlib>
#define maxn 200001
#define mod 10007 using namespace std;
int n,m,cnt,ans,num,tot,x,y,z,maxx;
int head[maxn],deep[maxn],dis[maxn];
int f[maxn][];
struct node
{
int from;
int to;
int dis;
int next;
}e[maxn*]; int init()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void add(int from,int to)
{
e[++num].from=from;
e[num].to=to;
e[num].next=head[from];
head[from]=num;
} void get_fa()
{
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
f[i][j]=f[f[i][j-]][j-];
} void Dfs(int from,int now,int cnt)
{
f[now][]=from;deep[now]=cnt;
for(int i=head[now];i;i=e[i].next)
{
int v=e[i].to;
if(v!=from)
Dfs(now,v,cnt+);
}
} int main()
{
n=init();
for(int i=;i<n;i++)
{
x=init();y=init();
add(x,y);add(y,x);
}
for(int i=;i<=n;i++)
dis[i]=init();
Dfs(,,);
get_fa();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(j==i) continue;
{
if(deep[i]==deep[j]&&f[i][]==f[j][]||deep[i]-deep[j]==&&f[i][]==j||deep[j]-deep[i]==&&f[j][]==i)
{
tot+=dis[i]*dis[j];
maxx=max(maxx,dis[i]*dis[j]);
}
}
}
printf("%d %d\n",maxx,tot%mod);
}
/*
峰峰果然是大神 果然裸地LCA枚举60分
开始的思路 求出每两个点之间的距离(其实枚举两个点就T了)
统计为2 的点对 然后统计答案
倍增LCA的话 是O(n+n*n) 后面的n*n是枚举那两个点
T了 60分
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200010
using namespace std;
int n,w[maxn],fa[maxn][],head[maxn],num,dep[maxn],ans,sum;
struct node
{
int u,v,pre;
}e[maxn*];
int init()
{
int x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Add(int from,int to)
{
num++;
e[num].u=from;
e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Dfs(int now,int from,int c)
{
fa[now][]=from;
dep[now]=c;
for(int i=head[now];i;i=e[i].pre)
if(e[i].v!=from)
Dfs(e[i].v,now,c+);
}
void Get_fa()
{
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-];
}
int Get_a(int a,int t)
{
for(int i=;i<=t;i++)
a=fa[a][];
return a;
}
int LCA(int a,int b)
{
if(dep[a]<dep[b])swap(a,b);
a=Get_a(a,dep[a]-dep[b]);
if(a==b)return a;
for(int i=;i>=;i--)
if(fa[a][i]!=fa[b][i])
{
a=fa[a][i];
b=fa[b][i];
}
return fa[a][];
}
int main()
{
//freopen("linkb.in","r",stdin);
//freopen("linkb.out","w",stdout);
n=init();
int u,v;
for(int i=;i<=n-;i++)
{
u=init();v=init();
Add(u,v);Add(v,u);
}
for(int i=;i<=n;i++)
w[i]=init();
Dfs(,,);
Get_fa();
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
{
int anc=LCA(i,j);
int deep=dep[i]+dep[j]-*dep[anc];
if(deep==)
{
ans=max(ans,w[i]*w[j]);
sum=(sum+w[i]*w[j])%;
}
}
printf("%d %d\n",ans,sum*%);
return ;
}
/*
因为默认的边权值是1 所以距离为2的点也就是从同一个点出发的两个
这样我们不需要n*n的枚举点 我们统计每个点之间相连的
然后两两组合 这里会发现 又跑慢了 70分
假设点x直接相连的点有三个 权值分别是a b c
那么我们两两组合后总权值是ab+bc+ac
会发现这里和之前用线段树求区间两两元素之和是一样的
根据数学公式 (a+b+c)^2-a^2-b^2-c^2=2*(ab+bc+ac)
这样我们就可以很快地求出权值和 至于最大的嘛 那肯定是最大的两个点权之积
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200010
#define mod 10007
using namespace std;
int n,w[maxn],head[maxn],num,ans,sum;
struct node
{
int u,v,pre;
}e[maxn*];
int cmp(int x,int y)
{
return x>y;
}
int init()
{
int x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Add(int from,int to)
{
num++;
e[num].u=from;
e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
int main()
{
//freopen("linkb.in","r",stdin);
//freopen("linkb.out","w",stdout);
n=init();
int x,y;
for(int i=;i<=n-;i++)
{
x=init();y=init();
Add(x,y);Add(y,x);
}
for(int i=;i<=n;i++)
w[i]=init();
for(int u=;u<=n;u++)
{
int p[maxn],l=,tmp=,s=;
for(int i=head[u];i;i=e[i].pre)
p[++l]=w[e[i].v];
sort(p+,p++l,cmp);
ans=max(ans,p[]*p[]);
for(int i=;i<=l;i++)
{
tmp=(tmp+p[i]*p[i]%mod)%mod;
s=(s+p[i]%mod)%mod;
}
sum=(sum+(s*s-tmp)%mod)%mod;
}
printf("%d %d\n",ans,sum);
return ;
}
codevs3728联合权值(LCA)的更多相关文章
- codevs3728 联合权值
题目描述 Description 输入描述 Input Description 输出描述 Output Description 样例输入 Sample Input 样例输出 Sample Output ...
- 「NOIP2014」「Codevs3728」 联合权值(乱搞
3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 输入描述 Input Description 输出描述 Ou ...
- [NOIP2014提高组]联合权值
题目:洛谷P1351.Vijos P1906.codevs3728.UOJ#16. 题目大意:有一个无向连通图,有n个点n-1条边,每个点有一个权值$W_i$,每条边长度为1.规定两个距离为2的点i和 ...
- NOIP 2004 联合权值
洛谷 P1351 联合权值 洛谷传送门 JDOJ 2886: [NOIP2014]联合权值 D1 T2 JDOJ传送门 Description 无向连通图 G有 n个点,n-1条边.点从 1到 n依次 ...
- 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 点的最短距离. ...
- [NOIP2014] 提高组 洛谷P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- 【洛谷P1351】联合权值
我们枚举中间点,当连的点数不小于2时进行处理 最大值好搞 求和:设中间点 i 所连所有点权之和为sum 则对于每个中间点i的联合权值之和为: w[j]*(sum-w[j])之和 #include< ...
随机推荐
- 洛谷——P1273 有线电视网
P1273 有线电视网 题目大意: 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树 ...
- 【Codeforces 922D】Robot Vacuum Cleaner
[链接] 我是链接,点我呀:) [题意] 让你把n个字符串重新排序,然后按顺序连接在一起 使得这个组成的字符串的"sh"子序列最多 [题解] /* * 假设A的情况好于B * 也就 ...
- mongodb shell之使用js(二)
mongodb shell之使用js(二) mongodb shell不仅是个交互式shell,还能够使用js脚本进行访问. 使用js脚本进行交互的优点与缺点 (1)无需任何驱动或语言支持: (2)方 ...
- HDU 4451 容斥原理
题目大意: n件衣服,m条裤子,k双鞋子进行搭配 妈妈指明了哪些衣服和裤子不能搭配,哪些裤子和鞋子不能搭配,问最后有几种搭配方法 先假设都能搭配 n*m*k 每次遇到衣服和裤子不能搭的,就要减一次k, ...
- C语言试题(标准答案)
C语言试题(标准答案) 一.单选题(每小题2分,共20小题40分) 1.1-1.5 B D A C B 1.6-1.10 C A D B C 1.11-1.1 ...
- cpus Vs cpu period and cpu quota
1. https://docs.oracle.com/cd/E37670_01/E75728/html/section-zb1_wqw_gt.html To control a container' ...
- bzoj1072【SCOI2007】排列perm
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1479 Solved: 928 [id=1072&q ...
- Java并发:线程安全的单例模式
转载请注明出处:jiq•钦'stechnical Blog 1.饿汉式 public class Singleton { private final static Singleton INSTANCE ...
- 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉载入很多其它
一.概述 本篇博客介绍的是怎样使用SwipeRefreshLayout和RecyclerView实现高仿简书Android端的下拉刷新和上拉载入很多其它的效果. 依据效果图能够发现,本案例实现了例如以 ...
- Qt移动应用开发(二):使用动画框架
Qt移动应用开发(二):使用动画框架 上一篇博客介绍了怎样使用Qt的QML来对屏幕分辨率大小进行适应,其实,不同分辨率的适应是一个很棘手的问题,除了分辨率不同外,宽高比(aspect ratio)也不 ...