Problem 2207 以撒的结合

Accept: 47    Submit: 161
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

小茗同学最近在认真地准备比赛,所以经常玩以撒的结合。

《以撒的结合》是一款由Edmund McMillen,Florian Himsl 开发,并由Edmund McMillen最早于2011年09月29日发行的一款2D平面角色扮演、动作冒险类的独立游戏。游戏的角色将在有着能够提升能力的道具与特殊技能的半RPG世界中闯荡。

——来自百度百科

小茗同学在打BOSS前,费掉了很多HP。在地图的一些房间里有补充HP的红心,然而小茗同学受到了看不见地图的诅咒。凭借不知道哪里来的记忆,小茗同学记得某个有红心的房间在房间A与房间B的路上的第K个房间里。为了简化问题,我们把地图看成一棵树。小茗同学想知道A到B的第K个房间号为多少,由于小茗同学很累,所以现在这个任务交给你了。

 Input

第一行是一个整数T(T<=10),表示有T组测试数据。

每组数据的第一行为两个整数n m(0<n<=1000,0<m<=n*n),分别表示房间个数和询问次数。

接下来n-1行,每行两个整数u v(0<u、v<=n,且u≠v),表示地图上房间u和房间v有一条路径。

最后是m行,每行三个整数u v k,表示询问房间u到房间v的路径上的第k个房间。

输入数据保证合法,即k不超过u、v的最短距离。

 Output

对于每组数据,首先第一行先输出“Case #x:“ ,其中x是从1开始,表示数据组号,接下来m行,每行输出相应的房间号。

 Sample Input

1
6 3
1 2
2 4
2 5
1 3
3 6
4 6 4
1 6 2
4 5 3

 Sample Output

Case #1:
3
3
5

 Source

FOJ有奖月赛-2015年11月

解题思路:首先我们求出u,v两点的LCA为x,然后来判断出k在u-x段还是在v-x段。然后记录每个点u与祖先ancestor的距离,然后O(1)查询。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<math.h>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long LL;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
const int maxn = 1300;
const LL mod = 1000000007;
const int INF = 0x3f3f3f3f;
struct AdjEdge{int to,w,next;
}adjedges[maxn*2];
int head[maxn];
int vset[maxn*2],dep[maxn],d[maxn*2][30],first[maxn];
int fa[maxn][maxn];
int tot,nn;
void init(){tot=0;nn=0;memset(dep,0,sizeof(dep));memset(head,-1,sizeof(head));memset(d,0,sizeof(d));memset(first,0,sizeof(first));
}
void addedge(int _u,int _v){     //adjedges[tot].to=_v;adjedges[tot].next=head[_u];head[_u]=tot++;
//    adjedges[tot].to=_u;
//    adjedges[tot].next=head[_v];
//    head[_v]=tot++;
}void dfs(int _u,int _fa,int _dep){// printf("%d %d\n",_u,_dep);dep[_u]=_dep;vset[++nn]=_u;first[_u]=nn;fa[_u][0] = _u;for(int i = 1; i <= _dep; i++){fa[_u][i] = fa[_fa][i-1];}for(int i=head[_u];i!=-1;i=adjedges[i].next){AdjEdge & e = adjedges[i];if(e.to!=_fa){dfs(e.to,_u,_dep+1);vset[++nn]=_u;}}
}
void ST(){for(int i=1;i<=nn;i++)d[i][0]=vset[i];for(int j=1; (1<<j)<=nn; j++){for(int i=1; i+(1<<j)-1<=nn; i++){if(dep[d[i][j-1]]<dep[d[i+(1<<(j-1))][j-1]])d[i][j]=d[i][j-1];else d[i][j]=d[i+(1 << (j-1))][j-1];}}
}int RMQ(int L,int R){int k=0;while((1<<(k+1))<=R-L+1) k++;if(dep[d[L][k]]<=dep[d[R-(1<<k)+1][k]])return d[L][k];return d[R-(1<<k)+1][k];
}
void tes(){for(int i =1; i <= 7; i++){for(int j = 0; j <= 4; j++){printf("%d ",fa[i][j]);}puts("");}
}
int main(){int T, n, q, cas = 0;scanf("%d",&T);while(T--){init();int a,b,k;scanf("%d%d",&n,&q);for(int i=1; i<n; i++){scanf("%d%d",&a,&b);addedge(a,b);addedge(b,a);}memset(fa,0,sizeof(fa));dfs(1,0,1);    //dep 1ST();//   tes();printf("Case #%d:\n",++cas);int x;for(int i=0; i<q; i++){scanf("%d%d%d",&a,&b,&k);if(first[a]<=first[b]){x = RMQ(first[a],first[b]);}else{x = RMQ(first[b],first[a]);}if(k == 1){printf("%d\n",a);}else if(dep[a] + dep[b] - 2*dep[x] + 1 == k){printf("%d\n",b);}else if(dep[a] - dep[x] + 1 >= k){printf("%d\n",fa[a][k-1]);}else{int kk = dep[a] + dep[b] - 2*dep[x] - k + 1;printf("%d\n",fa[b][kk]);}}}return 0;
}/*
55
7 10
1 2
1 3
2 4
2 5
5 6
5 74 3 3
4 3 2
7 4 3
4 7 3
4 7 4*/

  

转载于:https://www.cnblogs.com/chengsheng/p/5288003.html

FZU 2207 ——以撒的结合——————【LCA + 记录祖先】相关推荐

  1. FZU 2207 以撒的结合(LCA+记录路径)

    Problem Description 小茗同学最近在认真地准备比赛,所以经常玩以撒的结合. <以撒的结合>是一款由Edmund McMillen,Florian Himsl 开发,并由E ...

  2. Fzu 2207 以撒的结合【思维+Dfs序】好题!好题!

     Problem 2207 以撒的结合 Accept: 68    Submit: 219 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Prob ...

  3. 福州大学acm Problem 2207 以撒的结合

    Problem 2207 以撒的结合 Accept: 72    Submit: 239 Time Limit: 1000 mSec    Memory Limit : 32768 KB Proble ...

  4. FZU2207 以撒的结合(最近公共祖先lca,在线倍增)

    Problem Description 小茗同学最近在认真地准备比赛,所以经常玩以撒的结合. <以撒的结合>是一款由Edmund McMillen,Florian Himsl 开发,并由E ...

  5. Uva 11354 LCA 倍增祖先

    题目链接:https://vjudge.net/contest/144221#problem/B 题意:找一条从 s 到 t  的路,使得瓶颈路最小. 点的数目是10^4,如果向之前的方案求 maxc ...

  6. 【FOJ2207 11月月赛C】【DFS栈性质应用 离线处理】以撒的结合 从x到y路径上的第k个点 询问众多

     Problem 2207 以撒的结合 Accept: 30    Submit: 98 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  7. fzu月赛(2015.11)

    Problem 2205 据说题目很水  Problem Description Sunday最近对图论特别感兴趣,什么欧拉回路什么哈密顿回路,又是环又是树.在看完一本书后,他对自己特别有信心,便找到 ...

  8. POJ1330-Nearest Common Ancestors【tarjan,LCA】

    正题 题目链接: http://poj.org/problem?id=1330 题目大意 就是给出一棵树,求LCA(最近公共祖先) 解题思路 用tarjan求LCA,这里给出tarjan算法 代码 # ...

  9. wyh的商机(tarjan离线求lca)

    时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 一天,你们wyh学长和你们zhl学长玩一个 ...

最新文章

  1. 摘:C/C++中时间类time.h
  2. Discuz升级 Database Error : pre_common_syscache ADD PRIMARY KEY (cname)【解决办法】
  3. HTML5本地存储 localStorage
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第3篇]影响计算能力和存储能力的因素
  5. What day is that day?(快速幂,打表找周期,或者求通项公式)
  6. C++ Templates之模板元编程
  7. 安卓调用系统拍照功能:1、启动拍照返回图片,2、启动拍照,图片存储在指定路径下
  8. LCS2005标准版部署
  9. GNU make 汇总
  10. python滤波器处理数据的优点_使用Python对原始信号应用合适的butterworth滤波器
  11. 平板android怎么玩电脑游戏,Android平板模拟家用主机游戏教程_小米 平板_平板电脑新闻-中关村在线...
  12. java异步队对联_对联广告(带关闭的)
  13. 《计算机网络自顶向下》笔记
  14. NLP 之 jieba (结巴)制作词云
  15. vue框架如何将SPA项目改为SSR项目
  16. 计算机管理无法连接虚拟磁盘服务,win10系统电脑打开磁盘管理出现“无法连接虚拟磁盘服务”的教程...
  17. 单片机c语言报错_asm啥意思,SPMC75系列单片机地C和ASM( - 控制/MCU - 电子发烧友网...
  18. 正在与python恋爱
  19. mac上MAMP的各种坑
  20. Windows软件打包工具

热门文章

  1. PHP绘制圣诞树 圣诞树(油画效果)
  2. python anaconda安装redis_python与redis的初次碰撞——把玩redis数据库的一点心得
  3. 安卓 WebView 白屏(记录)
  4. Java笔记:JSON
  5. java 宠物合成 游戏,天天酷跑5个S级宠物能合成什么宠物 5个S级宠物合成宠物介绍...
  6. 电脑匹配,汽车节气门清洗后都要做电脑匹配吗?
  7. word不能输入中文
  8. .Net Core 智能提示汉化包
  9. C/C++中的system函数所有用法!
  10. Linux系统修复网络,解决Linux系统故障排查和修复技巧的3种方法解析与案例分享...