YOUSIKI 在 noip2016 的一道《天天爱跑步》的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰《跑步爱天天》。

有一个以 1 为根的有根树,初始每个点都有个警卫,每个警卫会按深度优先的顺序周期性的巡逻以其初始点为根的子树(详见样例解释),一个时刻走且仅走一条边。

YOUSIKI 初始在 x 点,他要到根结点拜访皮皮妖,他会沿着最短路径走,一个时刻走且仅走一条边,当他走到这个点时,如果遇到了警卫,他会消耗 1点妖气将这个警卫杀死,杀死后的警卫就不会在以后的路程中出现。

那么 YOUSIKI 需要消耗几点妖气才能拜访到皮皮妖呢?

输入格式

第一行一个数字 T,表示有 T 组数据。

对于每组数据,第一行一个整数 n,表示树有 n个结点。

接下来 n 行,第 i 行有一个整数 k,表示 i号点儿子个数,接下来 k 个整数,表示 k 个有序儿子 (“有序” 的含义详见样例解释)。

最后一行一个整数 x,表示 YOUSIKI 的出发点。

输出格式

输出 T 行,每行一个整数表示答案。

数据范围

对于 20% 的数据,n≤100。

对于 40% 的数据:n≤2000。

对于另外 10% 的数据:树高 ≤5。

对于另外 10% 的数据:树是一条链。

对于 100% 的数据:T≤10,n≤500000。

样例解释

为了方便,我们把初始在 iii 号点的警卫称为警卫 iii。

警卫 1 的一个周期内的巡逻路线为:1->2->4->2->5->2->1->3->6->3->1。

警卫 2 的一个周期内的巡逻路线为:2->4->2->5->2。

警卫 3 的一个周期内的巡逻路线为:3->6->3。

警卫 4,5,6 一直不动。

YOUSIKI 的路线为:6->3->1。

YOUSIKI 初始在 6 号点,需要杀掉警卫 6。第一时刻他在 3 号点,虽然他和警卫 3 对穿过去,但是由于没有在点上相遇,所以不算相遇。第二时刻他在 1 号点,此时 111 号点没有警卫。

注意

  1. 警卫的巡逻是周期性的,例如,初始在 2 号点警卫的巡逻路线为:2->4->2->5->2->4->2->5->2->4->2->5->2->...

  2. 输入格式中的 “有序” 指的是比如 1 号点的儿子先输入的 2 再输入的 3,那么 1 号点巡逻时就要先巡逻 2 再巡逻 3。

样例输入

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

样例输出

1

我们先把整个树 dfs 一遍,遇到一个点就把这个点记录到一个数组后边,
即求出了树的欧拉序,显然如果不考虑循环的话,guard是在这个序列上每次往后走一个,起始位置就是第i个点第一次出现的位置

假设 YOUSIKI 现在走到了 x 点,过了 t 秒,那么我们在这个序列上遍历 x 出现的所有位置,
并查看这个位置往前 t 个是否为 x 的祖先,如果是,把那个祖先标为1,表示已被消灭

坑点1:因为要按输入顺序遍历子节点,而链式前向星建出的图是从后往前的

所以要把加边的顺序反过来

坑点2:相遇的警卫只能是往下走的,且起始位置为第一个出现的i,所以第前t个

祖先必须是第一个出现的

 

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node
{
int next,to;
}edge[];
int num,head[],dep[],dfn[];
int s,cl,tot,t[],n,ans,f[],st[];
bool vis[],mark[];
int gi()
{
char ch=getchar();
int x=;
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x;
}
void add(int u,int v)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
}
void dfs(int x)
{int i;
dfn[++tot]=x;f[tot]=;
mark[x]=(x==s);
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
dep[v]=dep[x]+;
dfs(v);
if (mark[v]) mark[x]=;
dfn[++tot]=x;f[tot]=;
}
if (mark[x]) t[x]=cl++;
}
int main()
{int T,i,j,k,x;
cin>>T;
while (T--)
{
memset(head,,sizeof(head));
num=;cl=;tot=;
memset(mark,,sizeof(mark));
memset(dep,,sizeof(dep));
memset(t,,sizeof(t));
memset(f,,sizeof(f));
n=gi();
for (i=;i<=n;i++)
{
k=gi();
for (j=;j<=k;j++)
{
st[j]=gi();
}
for (j=k;j>=;j--)
add(i,st[j]);
}
s=gi();
dep[]=;
dfs();
ans=;
memset(vis,,sizeof(vis));
int u,v;
for (i=;i<=tot;i++)
{
if (mark[u=dfn[i]]&&i>t[u]&&f[i-t[u]])
if (mark[v=dfn[i-t[u]]]&&dep[v]<=dep[u])
if (vis[v]==)
{
ans++;
vis[v]=;
}
}
cout<<ans<<endl;
}
}

计蒜客NOIP模拟赛4 D2T2 跑步爱天天的更多相关文章

  1. 计蒜客NOIP模拟赛(2) D2T2紫色百合

    [问题描述] “牵着你的手的是她,路边开满了紫色的百合花……” 你从梦中醒来,却依然忘不了梦中的她百合花,每朵百合花都有一个权值,在二进制下写成一行‘1’,第i朵紫色百合的权值在二进制下写成i个‘1’ ...

  2. 计蒜客NOIP模拟赛D2T2 直线的交点

    伦伦刚刚在高中学习了解析几何,学会了计算两条直线的交点.这天,老师给她布置了一道作业.在平面上有 nnn 条直线,他们之间有若干交点.给定一对平板(两条平行的直线),问这有多少对直线,他们的交点在这一 ...

  3. 计蒜客NOIP模拟赛6 D1T1Diamond-square

    Diamond-square 算法是一种能够用于生成噪声的算法,现在我们考虑这个算法的一个变种. 你有一个 2^n\times 2^n2​n​​×2​n​​ 的网格,一共有 (2^n+1)^2(2​n ...

  4. 计蒜客NOIP模拟赛4 D2T1 鬼脚图

    鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线, ...

  5. 计蒜客 NOIP模拟赛(3) D1T1火山喷发

    火山喷发对所有附近的生物具有毁灭性的影响.在本题中,我们希望用数值来模拟这一过程. 在环境里有 nnn 个生物分别具有 A1,A2,⋯,An​​点生命值,一次火山喷发总计 M轮,每轮造成 1点伤害,等 ...

  6. 计蒜客NOIP模拟赛(2) D1T1邻家男孩

    凡是一个具有领导力的孩子.现实生活中他特别喜欢玩一个叫做 UNO 的纸牌游戏,他也总是带着其他小朋友一起玩,然后战胜他们.慢慢地,他厌倦了胜利,于是准备发明一种新的双人纸牌游戏. 初始时,每个人手中都 ...

  7. 计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi

    那年一个雨季,AmyZhi 在校门外弯身买参考书. 这时 SiriusRen 走过来,一言不合甩给她一道“自认为”很难的题: --------------- 给你一个数字 NN(NN 的范围是 11  ...

  8. 计蒜客NOIP模拟赛4 D1T3 小X的佛光

    小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水. 小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X ...

  9. 计蒜客NOIP模拟赛4 D1T2小X的密室

    小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...

随机推荐

  1. Alpha第八天

    Alpha第八天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

  2. python3变量和数据类型

        变量和数据类型 知识点 python 关键字 变量的定义与赋值 input() 函数 字符串的格式化 实验步骤 每一种编程语言都有它们自己的语法规则,就像我们所说的外语. 1. 关键字和标识符 ...

  3. GPUImage滤镜效果翻译

    #import"GPUImageBrightnessFilter.h"//亮度 #import"GPUImageExposureFilter.h"//曝光 #i ...

  4. EMC CX4-480服务器raid磁盘数据恢复案例

    [用户信息]上海某公司 [故障描述]需要进行数据恢复的设备是一台EMC CX4的存储服务器,因为硬盘出现故障导致整个存储阵列瘫痪.整个LUN是由7块1TB的硬盘组成的RAID 5.但服务器共有10块硬 ...

  5. python之路--day15--常用模块之logging模块

    常用模块 1 logging模块 日志级别:Noset (不设置) Debug---(调试信息)----也可用10表示 Info--(消息信息)----也可用20表示 Warning---(警告信息) ...

  6. 4-51单片机WIFI学习(开发板51单片机自动冷启动下载原理)

    上一篇链接 http://www.cnblogs.com/yangfengwu/p/8743936.html 这一篇说一下自己板子的51单片机自动冷启动下载原理,我挥舞着键盘和鼠标,发誓要把世界写个明 ...

  7. 安装 docker-compose

    安装Docker-Compose之前,请先安装 python-pip,安装好pip之后,就可以安装Docker-Compose了. 一.检查是否已经安装 二.安装 docker-compose 1.安 ...

  8. Angular 学习笔记 ( PWA + App Shell )

    PWA (Progressive Web Apps) 是未来网页设计的方向. 渐进式网站. Angular v5 开始支持 pwa 网站 (所谓支持意思是说有一些 build in 的方法和规范去实现 ...

  9. 使用URL访问http服务器

    一.概念定义 1.URI - 通用资源标识符 URI通常由三部分组成, 资源访问机制 存放资源的主机名 资源自身名称 如: http://www.baidu.com/html http://www.b ...

  10. SSO的全方位解决方案 - Kerberos协议(RFC 1510)

    一.桌面SSO和WEB-SSO的局限性 前面我们的解决方案(桌面SSO和WEB-SSO)都有一个共性:要想将一个应用集成到我们的SSO解决方案中,或多或少的需要修改应用程序. Web应用需要配置一个我 ...