博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOIP2016】天天爱跑步
阅读量:6407 次
发布时间:2019-06-23

本文共 2285 字,大约阅读时间需要 7 分钟。

 

Description

小C同学认为跑步非常有趣,于是决定制作一款叫做《天天爱跑步》的游戏。《天天爱跑步》是一个养成类游戏,需要玩家每天按时上线,完成打卡任务。 

这个游戏的地图可以看作一棵包含n个结点和n-1条边的树,每条边连接两个结点,且任意两个结点存在一条路径互相可达。树上结点编号为从1到n的连续正整数。 
现在有m个玩家,第i个玩家的起点为Si,终点为Ti。每天打卡任务开始时,所有玩家在第0秒同时从自己的起点出发,以每秒跑一条边的速度,不间断地沿着最短路径向着自己的终点跑去,跑到终点后该玩家就算完成了打卡任务。(由于地图是一棵树,所以每个人的路径是唯一的)

Input

第一行有两个整数n和m。其中n代表树的结点数量,同时也是观察员的数量,m代表玩家的数量。 

接下来n-1行每行两个整数u和v,表示结点u到结点v有一条边。 
接下来一行n个整数,其中第j个整数为Wj,表示结点j出现观察员的时间。 
接下来m行,每行两个整数Si和Ti,表示一个玩家的起点和终点。 
对于所有的数据,保证1≤Si,Ti≤n,0≤ Wj ≤n。

Output

输出1行n个整数,第j个整数表示结点j的观察员可以观察到多少人。

Sample Input

6 3 

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

Sample Output

2 0 0 1 1 1

Hint

提示: 

对于1号点,W1=0,故只有起点为1号点的玩家才会被观察到,所以玩家1和玩家2被观察到,共2人被观察到。 
对于2号点,没有玩家在第2秒时在此结点,共0人被观察到。 
对于3号点,没有玩家在第5秒时在此结点,共0人被观察到。 
对于4号点,玩家1被观察到,共1人被观察到。 
对于5号点,玩家2被观察到,共1人被观察到。 
对于6号点,玩家3被观察到,共1人被观察到。

Pic

如果你的程序需要用到较大的栈空间(这通常意味着需要较深层数的递归),请务必仔细阅读选手目录下的文档running/stackpdf,以了解在最终评测时栈空间的限制与在当前工作环境下调整栈空间限制的方法。

Source

NOIP2016, LCA,搜索dfs

 

题解:

  见 ljh学长的博客吧,好久没有看到这么好的题解了,代码基本和他差不多。题解也是看他的看懂的。  http://www.cnblogs.com/ljh2000-jump/p/6189053.html

 

代码:

 

#include 
#include
#include
#include
#include
#include
#include
#define MAXN 600011#define move 300000using namespace std;int dep[MAXN],f[MAXN][20];vector
sy1[MAXN],sy2[MAXN],sy3[MAXN];int ans[MAXN],tong[MAXN],num[MAXN],val[MAXN];int w[MAXN],n,m,numm=0,maxx=0;struct edge{ int first,next,to;}a[MAXN];struct query{ int from,to,lca,len;}q[MAXN];void addedge(int from,int to){ a[++numm].to=to;a[numm].next=a[from].first;a[from].first=numm;}void pre(int now,int ff){ dep[now]=dep[ff]+1;f[now][0]=ff;maxx=max(maxx,dep[now]); for(int i=a[now].first;i;i=a[i].next){ int to=a[i].to; if(to==ff) continue; pre(to,now); }}int Lca(int x,int y){ if(dep[x]
=0;i--) if(dep[x]-(1<
=dep[y]) x=f[x][i]; if(x==y) return x; for(int i=t;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; return f[x][0];}void dfs1(int x,int fa){ int now=w[x]+dep[x],cut;if(now<=maxx) cut=tong[now]; for(int i=a[x].first;i;i=a[i].next){ int to=a[i].to;if(to==fa) continue; dfs1(to,x); } tong[dep[x]]+=val[x];if(now<=maxx) ans[x]=tong[now]-cut; int len=sy1[x].size();for(int i=0;i

 

转载于:https://www.cnblogs.com/renjianshige/p/7608267.html

你可能感兴趣的文章
linux多网卡路由设置
查看>>
八大监听器
查看>>
self.navigationController退出到指定页面,或者一次性pop出n个页面
查看>>
Quartz实现数据库动态配置定时任务
查看>>
iptables 端口转发以及双向通信
查看>>
备战一线互联网公司Java工程师面试题 (1)
查看>>
ThinkPHP中自动验证失败
查看>>
jquery图片切换插件jquery.cycle.js参数详解
查看>>
JavaScript push() 方法
查看>>
Map集合
查看>>
JSP基础语法1
查看>>
elasticsearch Java API 之GET API & DELETE API
查看>>
《深入理解Java虚拟机》——GC基础概念
查看>>
微信小程序联盟:官方文档+精品教程+demo集合(5月31日更新,持续更新中……)...
查看>>
Fastjson 的 Set类型和 WriteClassName 选项引起的BUG
查看>>
翻译: 星球生成 II
查看>>
IOS 多线程
查看>>
python序列化数据本地存放
查看>>
#CCNA#IP地址、子网划分参考资料网址
查看>>
比较不错的图片上传插件
查看>>