热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

noip2016day1T2天天爱跑步

题目描述小c同学认为跑步非常有趣,于是决定制作一款叫做《天天爱跑步》的游戏。《天天爱跑步》是一个养成类游戏,需要玩家每天按时上线,完成打卡任务。这个游戏的地图可以看作一一棵包含nn

题目描述

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

这个游戏的地图可以看作一一棵包含 nnn个结点和 n−1n-1n1条边的树, 每条边连接两个结点,且任意两个结点存在一条路径互相可达。树上结点编号为从111到nnn的连续正整数。

现在有mmm个玩家,第iii个玩家的起点为 SiS_iSi,终点为 TiT_iTi 。每天打卡任务开始时,所有玩家在第000秒同时从自己的起点出发, 以每秒跑一条边的速度, 不间断地沿着最短路径向着自己的终点跑去, 跑到终点后该玩家就算完成了打卡任务。 (由于地图是一棵树, 所以每个人的路径是唯一的)

小c想知道游戏的活跃度, 所以在每个结点上都放置了一个观察员。 在结点jjj的观察员会选择在第WjW_jWj秒观察玩家, 一个玩家能被这个观察员观察到当且仅当该玩家在第WjW_jWj秒也理到达了结点 jjj 。 小C想知道每个观察员会观察到多少人?

注意: 我们认为一个玩家到达自己的终点后该玩家就会结束游戏, 他不能等待一 段时间后再被观察员观察到。 即对于把结点jjj作为终点的玩家: 若他在第WjW_jWj秒前到达终点,则在结点jjj的观察员不能观察到该玩家;若他正好在第WjW_jWj秒到达终点,则在结点jjj的观察员可以观察到这个玩家。


输入格式

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

接下来 n−1n- 1n1行每行两个整数uuu和 vvv,表示结点 uuu到结点 vvv有一条边。

接下来一行 nnn个整数,其中第jjj个整数为WjW_jWj , 表示结点jjj出现观察员的时间。

接下来 mmm行,每行两个整数SiS_iSi,和TiT_iTi,表示一个玩家的起点和终点。

对于所有的数据,保证1≤Si,Ti≤n,0≤Wj≤n1\leq S_i,T_i\leq n, 0\leq W_j\leq n1Si,Tin,0Wjn 。


输出格式

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


输入输出样例

输入 #1

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

输出 #1

2 0 0 1 1 1

输入 #2

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

输出 #2

1 2 1 0 1

说明/提示

【样例1说明】

对于111号点,Wi=0W_i=0Wi=0,故只有起点为1号点的玩家才会被观察到,所以玩家111和玩家222被观察到,共有222人被观察到。

对于222号点,没有玩家在第222秒时在此结点,共000人被观察到。

对于333号点,没有玩家在第555秒时在此结点,共000人被观察到。

对于444号点,玩家111被观察到,共111人被观察到。

对于555号点,玩家111被观察到,共111人被观察到。

对于666号点,玩家333被观察到,共111人被观察到。

【子任务】

每个测试点的数据规模及特点如下表所示。 提示: 数据范围的个位上的数字可以帮助判断是哪一种数据类型。

【提示】

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

在最终评测时,调用栈占用的空间大小不会有单独的限制,但在我们的工作环境中默认会有 8MB8 MB8MB 的限制。 这可能会引起函数调用层数较多时, 程序发生栈溢出崩溃。

我们可以使用一些方法修改调用栈的大小限制。 例如, 在终端中输入下列命令 ulimit -s 1048576

此命令的意义是,将调用栈的大小限制修改为 1GB1 GB1GB。

例如,在选手目录建立如下 sample.cpp 或 sample.pas

将上述源代码编译为可执行文件 sample 后,可以在终端中运行如下命令运行该程序

./sample

如果在没有使用命令“ ulimit -s 1048576”的情况下运行该程序, sample会因为栈溢出而崩溃; 如果使用了上述命令后运行该程序,该程序则不会崩溃。

特别地, 当你打开多个终端时, 它们并不会共享该命令, 你需要分别对它们运行该命令。

请注意, 调用栈占用的空间会计入总空间占用中, 和程序其他部分占用的内存共同受到内存限制。

#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 300000 + 10 ;
int n,m,w[maxn];
struct Node
{int to,next;}edge[maxn * 2],edge1[maxn *2],edge2[maxn * 2];
struct node
{int lca,u,v,dis;}point[maxn];
int head[maxn * 2],cnt;
int st[maxn];
void add(int x,int y)
{
edge[++cnt].to=y;
edge[cnt].next=head[x];
head[x]=cnt;
}
int cnt1,cnt2,head1[maxn * 2],head2[maxn * 2];
void add1(int x,int y)
{
edge1[++cnt1].to=y;
edge1[cnt1].next=head1[x];
head1[x]=cnt1;
}
void add2(int x,int y)
{
edge2[++cnt2].to=y;
edge2[cnt2].next=head2[x];
head2[x]=cnt2;
}
int f[maxn][25],Dep[maxn];
void Build_tree(int u,int fa)
{
Dep[u]=Dep[fa]+1;
for(int i=0;i<=19;i++) f[u][i+1]=f[f[u][i]][i];
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa) continue;
f[v][0]=u;
Build_tree(v,u);
}
}
int ans[maxn * 2];
int Lca(int x,int y)
{
if(Dep[x] for(int i=20;i>=0;i--)
{
if(Dep[f[x][i]]>=Dep[y]) x=f[x][i];
if(x==y) return x;
}
for(int i=20;i>=0;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][0];
}
int dist(int x,int y)
{return Dep[x]+Dep[y]-2*Dep[Lca(x,y)];}
int b1[maxn * 2],b2[maxn * 2];
void dfs(int u)
{
int t1=b1[Dep[u]+w[u]],t2=b2[w[u]-Dep[u]+maxn];
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==f[u][0]) continue;
dfs(v);
}
b1[Dep[u]]+=st[u];
for(int i=head1[u];i;i=edge1[i].next)
{
int v=edge1[i].to;
b2[point[v].dis-Dep[point[v].v]+maxn]++;
}
ans[u]+=b1[w[u]+Dep[u]]-t1+b2[w[u]-Dep[u]+maxn]-t2;
for(int i=head2[u];i;i=edge2[i].next)
{
int v=edge2[i].to;
b1[Dep[point[v].u]]--;
b2[point[v].dis-Dep[point[v].v]+maxn]--;
}
}
int main()
{
cin>>n>>m;
for(int i=1,x,y;i {
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
Build_tree(1,0);
for(int i=1,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
point[i].u=x,point[i].v=y;
point[i].lca=Lca(x,y);
point[i].dis=dist(x,y);
st[point[i].u]++;
add1(point[i].v,i);
add2(point[i].lca,i);
if(Dep[point[i].lca]+w[point[i].lca]==Dep[point[i].u]) ans[point[i].lca]--;
//如果路径起点或终点刚好为LCA且LCA处是可观察到运动员的,那么我们在上行统计过程中和下行统计过程中都会对该LCA产生贡献,这样就重复计数一次!
}
dfs(1);
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}

 



推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
丙尔金开发_448
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有