Problem 2207 以撒的结合

Accept: 68    Submit: 219
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月

思路:

1、观察到N的范围不大,我们肯定可以O(n^2) 处理出来dist【i】【j】,表示从i走到j的最短距离。

那么如果存在一个询问u,v,k;

那么如果存在一个点tmp,使得dist【u】【tmp】+dist【tmp】【v】==dist【u】【v】&&dist【u】【tmp】==k,那么这个点tmp就是结果了。

然而对于每一个查询都这样去判断的话,时间复杂度会达到O(n^2+n*m);这里m很大,可以近似看做O(n^3);是肯定要TLE掉的。

2、那么我们考虑优化。

其实我们知道,这样的tmp点是唯一的。

而且如果我们以点u作为树的根的话,u和tmp都将会是点v的祖先。

我们可以处理Dfs序,来O(1)询问一个点是否是另一个点的祖先。

那么我们不妨离线去做。

那么我们设定q【i】【j】表示从点i,到某些点,距离为j的询问。

那么vector<>q【i】【j】需要存入两个信息,一个是查询的编号,另一个是查询的点。

接下来我们O(n)枚举一个点作为根,然后遍历整颗树,得到一个Dfs序,过程得到dist【i】【j】;

然后我们O(n)去枚举一个点作为结果点,那么对应dist【i】【j】就是两点间距离。

那么对于当前枚举出来的结果点,我们解决相关q【i】【dist[i][j]】中存入的询问。

设定点v为查询,即v=q【i】【dist[i][j]】.v;

如果当前点j,有:L【v】>=L【i】&&L【v】<=R【j】;那么此时就是说明,点j是点v的祖先。

那么成立:点j是从i到v的路径上的第dist【i】【j】个点。

整体查询时间复杂度O(n^2+m);

Ac代码:

#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
struct node
{int v,pos;
};
int ans[1050*1050];
int L[1050];
int R[1050];
int dist[1050][1050];
vector<int >mp[1050];
vector<node >q[1050][1050];
int n,m;
int tim;
void Dfs(int root,int u,int from,int depth)
{L[u]=++tim;dist[root][u]=depth;for(int i=0;i<mp[u].size();i++){int v=mp[u][i];if(v==from)continue;Dfs(root,v,u,depth+1);}R[u]=tim;
}
int main()
{int t;int kase=0;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)mp[i].clear();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){q[i][j].clear();}}for(int i=0;i<n-1;i++){int x,y;scanf("%d%d",&x,&y);mp[x].push_back(y);mp[y].push_back(x);}for(int i=0;i<m;i++){int u,v,len;scanf("%d%d%d",&u,&v,&len);node now;now.v=v;now.pos=i;q[u][len].push_back(now);}for(int i=1;i<=n;i++){tim=0;Dfs(i,i,-1,1);for(int j=1;j<=n;j++){for(int k=0;k<q[i][dist[i][j]].size();k++){node now=q[i][dist[i][j]][k];int v=now.v;//j是v的祖先if(L[v]>=L[j]&&L[v]<=R[j]){ans[now.pos]=j;}}}}printf("Case #%d:\n",++kase);for(int i=0;i<m;i++){printf("%d\n",ans[i]);}}
}

Fzu 2207 以撒的结合【思维+Dfs序】好题!好题!相关推荐

  1. FZU 2207 ——以撒的结合——————【LCA + 记录祖先】

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

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

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

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

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

  4. 牛客多校4 - Ancient Distance(树上倍增+dfs序+线段树)

    题目链接:点击查看 题目大意:给出一棵 n 个节点且以点 1 为根节点的的树,现在给出一个 k ,需要在树上选择 k 个关键点,使得 n 个点到达根节点的路径上,出现的最近的关键点的距离的最大值最小, ...

  5. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  6. A and B and Lecture Rooms CodeForces - 519E LCA+dfs序

    看到这个题的第一个思路就是就是统计以每一个点为根的所有节点个数,然后具体就分情况讨论一下即可. 因为刚刚学习了dfs序,这个题就用了dfs序来通过进出时间戳来相减表示其为根的子节点个数. 分情况 我们 ...

  7. POJ - 2763 Housewife Wind LCA+dfs序+线段树

    q次询问求两个点之间的距离,并且可以随时修改某条边的长度,最短距离可以用lca来求,但是树上维护每一个点到root的距离必须要用dfs序来记录时间戳,在dfs的时候顺便记录每一条边(u,v)对应的v节 ...

  8. New Year Tree(dfs序+线段树+二进制)

    题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...

  9. [codeforces] 383C Propagating tree(dfs序+线段树)

    题意: 给你一棵n个结点的树, 以1为根.每个结点有点权.有m次操作: 1.x结点权值 +val,x的儿子权值 −val,x的孙子们 +val,以此类推. 2.询问x的点权: 题解: 我们首先跑一边d ...

最新文章

  1. 机房几台终端电脑,本地连接中不停的出现连接和断开,网络不通,解决方法...
  2. string stringbuffer stringbuilder 区别
  3. DNS域名解析服务(正向解析、反向解析、主从服务器)
  4. html数字增加动态效果,jQuery实现数字自动增加或者减少的动画效果示例_泠吢_前端开发者...
  5. Excel小账本的来历
  6. [?]Solaris下两个Oracle同时启动时遇到的问题
  7. PHP 开发者如何做代码审查?
  8. CLIP还能做分割任务?哥廷根大学提出一个使用文本和图像prompt,能同时作三个分割任务的模型CLIPSeg,榨干CLIP能力...
  9. Python编写软件与从倍福PLC通讯软件
  10. 小程序 字号设置 slider滚动改变大小_Snipaste(滚动截图软件)app下载|Snipaste(滚动截图软件) 1.15.2 绿色版(32/64位)...
  11. 百科不全书之Python常用库
  12. ALFA缺陷检测软件外观检测自学习人工智能软件
  13. python输入个人所得税计算_Python实现的个人所得税计算器
  14. 新建的module没有蓝色小块
  15. nginx修改主目录、主页
  16. 【H2】绘制三角警示牌,使用turtle绘制三角警示牌,陈斌老师北京大学暑期学校Python语言基础与应用
  17. IDEA 卡住半天,buid(编译)不动——解决办法(适用于maven和gradle)及定位思路...
  18. springcloud-微服务
  19. Linux 安装Mysql8.0.15教程,以及修改密码
  20. 2016中国移动办公论坛暨《2016中国移动办公男神报告》发布会成功举办

热门文章

  1. Python:ERROR: Could not install packages due to an OSError: HTTPSConnectionPool
  2. Unity Android 之 获取系统语言(手机设备设置的系统语言)的二种方式(中文区分简体、繁体、日文)
  3. Cesium实现一材质多贴图,一个模型多张贴图,自定义attribute
  4. win10 点击任务栏图片输入法图标变动
  5. HTML 5 video 视频标签全属性详解(转)
  6. HarmonyOS 3.0省电模式或者低电模式真的省电吗?
  7. Nginx配置及配置加载
  8. linux mount 指定用户名,mount命令怎么用?Linux版mount命令完全使用手册
  9. Python + twilio 实现打电话和发短信功能
  10. 直销系统网站开发特点和优势有哪些