滴滴笔试AK(9月28日)

T1

n, a, b, c = map(int, input() .split())
cache = dict()

def dfs(i, a ,b, g):
    if (i,a, b,c) in cache:
        return 0
    ans = int(a + b > c and a + c > b and b + c > a)
    if n < i:
        cache[(i,a,b,c)] = ans
        return ans
    if c > i:
        ans += dfs(i + 1,a, b, c - i)
    if b > i:
        ans += dfs(i + 1,a, b - i, c)
    if a > i:
        ans += dfs(i + 1,a - i, b, c)
    cache[(i, a,b,c)] = ans

    return ans

print(dfs(1,a, b, c))

T2 换根dp,先dfs一次算出根为0时候的答案,记录一下每个节点的子树的大小,然后换根,计算的时候可以O(1)转移根节点

def dfs1(root):
    sz = 1
    for to in adj[root]:
        if vis[to]:
            continue
        vis[to] = 1
        sz2, ans2 = dfs1(to)
        sz += sz2
        ans[root] += ans2
    ans[root] += sz - 1
    szv[root] = sz
    return sz, ans[root]

def dfs2(root):
    for to in adj[root]:
        if vis[to]:
            continue
        vis[to] = 1
        t = ans[to]
        ans[to] += n - szv[to]
        ans[to] += ans[root] - t - szv[to]
        dfs2(to)

n, m = map(int, input().split())
adj = [[] for _ in range(n)]
p = [-1] * n
szv = [0] * n
ans = [0] * n

xv = list(map(int,input().split()))
for i in range(1, n):
    x = xv[i-1]-1
    p[i] = x
    adj[i].append(x)
    adj[x].append(i)

vis = [0] * n
vis[0] = 1
dfs1(0)

vis = [0] * n
vis[0] = 1
dfs2(0)

xv = list(map(int,input().split()))
for i in range(m):
    v = xv[i] - 1
    print(ans[v], end=" ")

#滴滴##笔试#
全部评论
依依神,太强了
点赞 回复 分享
发布于 2023-09-29 22:03 浙江
@青笛
点赞 回复 分享
发布于 2023-09-28 23:43 湖南
楼主,T1代码跑n, a, b, c = 1,100,100,100答案应该是4吧?你的答案是2.根据示例5,3,4,5的结果为10,顺序不同的原木组合应该算两种。
点赞 回复 分享
发布于 2023-09-28 23:37 江苏

相关推荐

真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

更多
牛客网
牛客企业服务