bzoj1832: [AHOI2008]聚会--LCA
本来觉得这是一道挺水的题目,后来觉得出题人挺变态的= =
半个小时敲完后,内存超限它给我看TLE,还是0ms,后来才发现内存限制64m
然后卡了一个小时后AC了。。
题目大意是在一棵树上找三点的最短路
依次挑两个点求LCA,再将LCA与第三个点再求LCA
求三次取最优就行了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
;
struct node{
int to,next;
}e[];
int sum,n,m,tot,logn,l,r,a,b,c,x,y,id;
],dep[maxn];
void insert(int u, int v, int c){
e[++tot].to=v;
//e[tot].cost=c;
e[tot].next=head[u];
head[u]=tot;
}
void dfs(int u, int f, int d){
dep[u]=d;
fa[u][]=f; //dis[u][0]=c;
; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-];
//for (int i=1; i<=logn; i++) dis[u][i]=dis[u][i-1]+dis[fa[u][i-1]][i-1];
; i=e[i].next)
if (e[i].to!=f)
dfs(e[i].to,u,d+);
}
int lca(int u, int v){
if (dep[u]>dep[v]) swap(u,v);
while (dep[u]<dep[v]){
; i--)
if (dep[u]<dep[fa[v][i]]){
//sum+=dis[v][i];
v=fa[v][i];
}
//sum+=dis[v][0];
v=fa[v][];
}
if (u==v) return u;
; i--)
if (fa[u][i]!=fa[v][i]){
// sum+=dis[v][i]+dis[u][i];
u=fa[u][i]; v=fa[v][i];
}
//sum+=dis[v][0]+dis[u][0];
u=fa[u][]; v=fa[v][];
return u;
}
int main(){
scanf("%d%d", &n, &m);
tot=-;
; i<=n; i++) head[i]=-;
//memset(head,-1,sizeof(head));
//memset(dis,0,sizeof(dis));
//memset(e,0,sizeof(e));
; i<n; i++){
scanf("%d%d", &l, &r);
insert(l,r,);
insert(r,l,);
}
logn=;
<<logn)<n) logn++;
dfs(,,);
; i<=m; i++){
scanf("%d%d%d", &a, &b, &c);
;
x=lca(a,b); y=lca(x,c);
sum=dep[a]+dep[b]+dep[c]-dep[x]-dep[y]*;
if (sum<ans){
ans=sum;
id=x;
}
x=lca(a,c); y=lca(x,b);
sum=dep[a]+dep[b]+dep[c]-dep[x]-dep[y]*;
if (sum<ans){
ans=sum;
id=x;
}
x=lca(b,c); y=lca(x,a);
sum=dep[a]+dep[b]+dep[c]-dep[x]-dep[y]*;
if (sum<ans){
ans=sum;
id=x;
}
printf("%d %d\n", id, ans);
}
;
}
bzoj1832: [AHOI2008]聚会--LCA的更多相关文章
- bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
bzoj1787[Ahoi2008]Meet 紧急集合 bzoj1832[AHOI2008]聚会 题意: 给个树,每次给三个点,求与这三个点距离最小的点. 题解: 倍增求出两两之间的LCA后,比较容易 ...
- bzoj1832: [AHOI2008]聚会
写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ 1832: [AHOI2008]聚会( LCA )
LCA模板题...不难发现一定是在某2个人的LCA处集合是最优的, 然后就3个LCA取个最小值就OK了. 距离就用深度去减一减就可以了. 时间复杂度O(N+MlogN) (树链剖分) -------- ...
- 题解 [BZOJ1832][AHOI2008] 聚会
题面 解析 首先对于其中的两个点\(x,y\)最近的点显然就是他们的\(lca\)(我们把它设为\(p1\)), 然后考虑第三个点\(z\)与\(p1\)的\(lca,p2\). 有以下几种情况: \ ...
- P4281 [AHOI2008]紧急集合 / 聚会[LCA]
解析 蒟蒻用的办法比较蠢,不如上面的各位大佬,直接化成一个式子了,我还是分类讨论做的. 下面正文. 猜想:最优集合点一定是三点任意两对点对应的路径的交点. 不妨这样想,如果任意两个人经过同一条路径,那 ...
- LUOGU P4281 [AHOI2008]紧急集合 / 聚会 (lca)
传送门 解题思路 可以通过手玩或打表发现,其实要选的点一定是他们三个两两配对后其中一对的$lca$上,那么就直接算出来所有的$lca$,比较大小就行了. #include<iostream> ...
- bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1841 Solved: 857[Submit][ ...
- 【BZOJ】1832: [AHOI2008]聚会
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1832 省选出出了CF的感觉..... 显然一发贪心,如果两个点显然就是他们的$LCA$(不 ...
- bzoj 1832: [AHOI2008]聚会
良心题2333 三个点两两求一遍就行,最小肯定是在某2个点的lca处,(肯定让第三个人去找2个人,不能让2个人一起去找第三个人233) #include<bits/stdc++.h> #d ...
随机推荐
- Nginx+Resin实现高性能JAVA平台搭建
现在流行的JavaEE容器有很多:Tomcat.Resin.JBoss.Glassfish等,我们常用的主要是前三种,那这个java容器性能方面到底谁更稳定,并发能力更强呢?那当属resin了,res ...
- BSGS[bzoj2242][bzoj3122]
数论题. 操作一:直接快速幂就好了. 操作二:我用了exgcd,shy和lyz都喜欢欧拉函数...QAQ最后这块还写错了. 对于ax+by=gcd(a,b)的形式,我们可以把他们变成y'x+p'y=1 ...
- Oracle 查询性能优化实践
1.索引使用原则 不要对索引使用全模糊,但是 LIKE 'asdf%'是可以的,即不要Contains,可用StartWith 不要对索引进行函数,表达式操作,或者使用is null判断,否则 ...
- poj2524-Ubiquitous Religions
C - Ubiquitous Religions Time Limit: 5000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d ...
- ural 1341. Device
1341. Device Time limit: 1.0 secondMemory limit: 64 MB Major (M): You claimed that your device would ...
- 【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)
RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...
- 【NOI2011】道路修建 BFS
[NOI2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建 ...
- ACM 笨小熊
笨小熊 时间限制:2000 ms | 内存限制:65535 KB 难度:2 描述 笨小熊的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项 ...
- 洛谷 洛谷 P1011 车站 Label:续命模拟QAQ 未知50分
题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起( ...
- css3立体旋转动画
demo地址 效果图 在别人网站上看到一个立体旋转的例子,然后突然想到自己前几天学习的css3旋转,就试着做了一个例子,看起来有一些粗糙. html结构很简单: <div> <ul ...