uoj#P1016. 【ULR #3】成王败寇

【ULR #3】成王败寇

English Statement

题目背景

在 UOJ Long Round #3 比赛进行到白热化阶段时,跳蚤国的互联网基础设施核心——CloudFlea 服务突然发生爆炸!爆炸源于一次错误的配置推送,导致 CloudFlea 的路由表数据库崩溃,全球网络服务中断。

比赛网站一度无法访问,评测姬响应缓慢,跳蚤们怨声载道。int128 皇帝紧急召集参赛者,宣布将这次危机转化为比赛的一部分:“谁能帮助修复 CloudFlea,谁就能在比赛中获得优势,并有望继承我的名号!” 调查发现,CloudFlea 的路由表使用一棵 01-trie 树存储所有 IP 地址的路由规则,需要快速查询路由规则。

现在,你需要帮 int128 皇帝解决以下问题,以确保比赛顺利进行。

题目描述

CloudFlea 的路由表在数据库中由一棵有 $n$ 个节点的 01-trie 树(以 $1$ 为根)存储。

对于树上的某个点 $i$,定义 $s_i$ 为从根节点到 $i$ 的路径上的字符从浅到深顺次连接得到的字符串($s_{1}=\varnothing$)。

$q$ 次询问,每次询问给出一个节点 $u$,以及若干条(不超过 $3$ 条)匹配规则 $(a_i,c_i)$。统计满足以下条件的节点 $x$ 个数:

  • $s_x$ 为 $s_u$ 后缀(可以相同,$s_x$ 可以是空串)。
  • 对于所有 $(a_i,c_i)$,若 $a_i\le |s_x|$,则需要满足 $s_x$ 的第 $a_i$ 个字符为 $c_i$;否则没有限制。

你的任务是回答所有询问,帮助 CloudFlea 恢复路由服务。

输入格式

第一行输入一个整数 $n$ 代表 01-trie 树的节点数。

之后的 $n-1$ 行每行两个数 $f,c$,其中第 $i$ 行的 $f_i,w_i$ 表示 $i$ 号点的父亲为 $f_i$,$(f_i,i)$ 的边权为 $w_i$。

第 $n+1$ 行输入一个整数 $q$ 表述询问数量。

之后的 $q$ 行每行先输入两个数 $u,k$ 表示查询节点 $u$ 和限制个数 $k$,之后在同一行内输入 $k$ 对整数 $a_1,c_1,a_2,c_2,...$ 表示 $k$ 组限制。保证 $a_i$ 单调递增

输出格式

对于每个询问,输出一行一个整数,表示满足条件的节点 $x$ 的个数。

样例输入

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

样例输出

3
2

数据范围

对于 $100\%$ 的数据,$2 \le n,q \le 2\times10^5$,$f_i< i$,$w_i,c_i\in\{0,1\}$,$1\le k\le 3$。

子任务 分值 $n,q\le$ 特殊性质 依赖
1 10 $1000$
2 20 $2\times 10^5$ $w_i$ 随机生成
3 20 $2\times 10^5$ $f_i=i-1$
4 50 $2\times 10^5$ 子任务 1,2,3

时间与空间限制:

  • 时间限制:$4\ \text{s}$。
  • 空间限制:$2\ \text{GiB}$。