计蒜客NOIP模拟赛4 D2T2 跑步爱天天
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 号点没有警卫。
注意
警卫的巡逻是周期性的,例如,初始在 2 号点警卫的巡逻路线为:2->4->2->5->2->4->2->5->2->4->2->5->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 跑步爱天天的更多相关文章
- 计蒜客NOIP模拟赛(2) D2T2紫色百合
[问题描述] “牵着你的手的是她,路边开满了紫色的百合花……” 你从梦中醒来,却依然忘不了梦中的她百合花,每朵百合花都有一个权值,在二进制下写成一行‘1’,第i朵紫色百合的权值在二进制下写成i个‘1’ ...
- 计蒜客NOIP模拟赛D2T2 直线的交点
伦伦刚刚在高中学习了解析几何,学会了计算两条直线的交点.这天,老师给她布置了一道作业.在平面上有 nnn 条直线,他们之间有若干交点.给定一对平板(两条平行的直线),问这有多少对直线,他们的交点在这一 ...
- 计蒜客NOIP模拟赛6 D1T1Diamond-square
Diamond-square 算法是一种能够用于生成噪声的算法,现在我们考虑这个算法的一个变种. 你有一个 2^n\times 2^n2n×2n 的网格,一共有 (2^n+1)^2(2n ...
- 计蒜客NOIP模拟赛4 D2T1 鬼脚图
鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线, ...
- 计蒜客 NOIP模拟赛(3) D1T1火山喷发
火山喷发对所有附近的生物具有毁灭性的影响.在本题中,我们希望用数值来模拟这一过程. 在环境里有 nnn 个生物分别具有 A1,A2,⋯,An点生命值,一次火山喷发总计 M轮,每轮造成 1点伤害,等 ...
- 计蒜客NOIP模拟赛(2) D1T1邻家男孩
凡是一个具有领导力的孩子.现实生活中他特别喜欢玩一个叫做 UNO 的纸牌游戏,他也总是带着其他小朋友一起玩,然后战胜他们.慢慢地,他厌倦了胜利,于是准备发明一种新的双人纸牌游戏. 初始时,每个人手中都 ...
- 计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi
那年一个雨季,AmyZhi 在校门外弯身买参考书. 这时 SiriusRen 走过来,一言不合甩给她一道“自认为”很难的题: --------------- 给你一个数字 NN(NN 的范围是 11 ...
- 计蒜客NOIP模拟赛4 D1T3 小X的佛光
小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水. 小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X ...
- 计蒜客NOIP模拟赛4 D1T2小X的密室
小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...
随机推荐
- JavaScript(第二十天)【DOM操作表格及样式】
DOM在操作生成HTML上,还是比较简明的.不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了.本章主要了解一下DOM操作表格和样式的一些知识. 一.操作表格 <table& ...
- Beta冲刺合集
Beta冲刺序列: Beta凡事预则立 :Beta No.0 Beta冲刺Day1:Beta No.1 Beta冲刺Day2:Beta No.2 Beta冲刺Day3:Beta No.3 Beta冲刺 ...
- Beta冲刺NO.2
Beta冲刺 第二天 1.昨天的问题 由于前面的冲刺留下的问题很多,而且混乱的代码给我们接下来的完善工作带来了巨大的困难. 2. 今天解决的进度 潘伟靖: 1.对代码进行了review 2.为系统增加 ...
- django搭建web (一)
建立工程 django-admin.py startproject project_name 建立app python manage.py startapp app_name 将app添加进工程中 在 ...
- Beta冲刺Day4
项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...
- SQL之Left Join 关联条件的探讨
在测试工作中,有时需要测试数据库数据经过sql计算后的结果是否满足某一功能查询得到的返回值. 针对某些需要功能需要联查多张表,此时 关联 的作用就异常重要了,而针对多表关联,其中 关联条件的重要性不言 ...
- 不看就亏了:DELL EqualLogic PS6100详解及数据恢办法
DELL EqualLogic PS6100采用虚拟ISCSI SAN阵列,为远程或分支办公室.部门和中小企业存储部署带来企业级功能.智能化.自动化和可靠性,支持VMware.Solaris.Linu ...
- 解决IE8下CSS3选择器 :nth-child() 不兼容的问题
1.定义和用法 :nth-child(n) 选择器匹配属于其父元素的第 N 个子元素,不论元素的类型. n 可以是数字.关键词或公式. <ul> <li>1</li> ...
- Linux入门:vi 和 vim
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器. 本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了! 转自:http://www.l ...
- python入门(11)条件判断和循环
python入门(11)条件判断和循环 条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: ag ...