uoj#P1016. 【ULR #3】成王败寇
【ULR #3】成王败寇
题目背景
在 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}$。