题目列表
这一类题目的思路。
- DFS 求DFS序。
- 按层存储+某种数据结构,维护区间信息。
- 二分查找,确定区间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。