树的深度优先遍历

题目列表

这一类题目的思路。

  1. DFS 求DFS序。
  2. 按层存储+某种数据结构,维护区间信息。
  3. 二分查找,确定区间left, right。
    这里的某种数据结构,可以是st表, 树状数组,线段树。等

其他思路,也可以转离线查询。

DFS序

# 输入的是father数组
# tree 表示树
tree = [[] for i in range(N)]
for y, x in enumerate(LI(), start=1):
    tree[x - 1].append(y)

in_ts = [0] * N
out_ts = [0] * N
ts = 0
hh_ts = [[0] for _ in range(N)]
hh_xor = [[0] for _ in range(N)]

stk = [[0, 0, 0]]
while stk:
    x, h, flag = stk.pop()
    if flag == 0:
        ts += 1
        in_seq[x] = ts
        hh_ts[h].append(ts)
        hh_xor[h].append(hh_xor[h][-1] ^ A[ord(s[x]) - 97])
        stk.append([x, h + 1, 1])
        for y in tree[x]:
            stk.append([y, h + 1, 0])
    else:
        ts += 1
        out_seq[x] = ts



for i in range(m):
    v, h = MI()
    v -= 1
    h -= 1
    l = bisect.bisect_left(hh_ts[h], in_seq[v])
    r = bisect.bisect_left(hh_ts[h], out_seq[v])
    if l >= r:
        print('Yes')
        continue
    l = max(l - 1, 0)
    r -= 1
    t = hh_xor[h][l] ^ hh_xor[h][r]
    if t & (t - 1) == 0:
        print('Yes')
    else:
        print('No')

other: CF Tree Requests。题目一直MLE,TLE。优化了尾递归,不再使用bootstrap装饰器,改用栈模拟,然后选择pypy3提交,不使用pypy3-64(这个内存会爆),历时一天终于AC。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值