牛客小白月赛95 解题报告 | 珂学家

相遇

https://ac.nowcoder.com/acm/contest/83687/A


前言

alt


题解

参加了内测,内测的结果和比赛的结果差别很大。

个人觉得蛮难的, 但是也学到了。


E. 相依

思路: DP

看着像划分形DP,但中间需要绕一下

从刷表法的思路推,会发现很难,如果从填表法,就能找到优化的点

dp[u] = min(dp[v] + 1), 满足 str[v + 1] == str[u]

核心是如何优化这个min

实际上,这边有技巧,存在单调性

最终的时间复杂度为

n = int(input())

arr = list(map(int, input().split()))

from collections import Counter
from math import inf

dp = Counter()
dp[arr[0]] = 0

res = inf
f = None
g = None
for i in range(1, n):
    if arr[i] in dp:
        if i == n - 1:
            res = dp[arr[i]] + 1
        else:
            g = (arr[i + 1], dp[arr[i]] + 1)
    if f is not None:
        if f[0] not in dp:
            dp[f[0]] = f[1]
        else:
            dp[f[0]] = min(dp[f[0]], f[1])
    f = g
    g = None

if res == inf:
    print (-1)
else:
    print (res)

F. 异或炸弹(hard)

灵机一动,想了一种类似二阶差分的思路,即对角线差分,然后再常规按行差分

但是再内测中,TLE到崩溃,尽力了

alt

方法一:旋转变换 + 二维差分(官解)

思路: 旋转变换

核心:

知识点:

alt


这样就可以把45度的平行四边形,转化为正方形

alt

然后用二维差分板子,即可求解

n, q = list(map(int, input().split()))

# 曼哈顿距离 转到 切比雪夫距离转换
arr = []
for _ in range(q):
    y, x, r = list(map(int, input().split()))
    arr.append((y - 1, x - 1, r))

nm = 2 * n + 1
diff = [[0] * nm for _ in range(nm)]

for (y, x, r) in arr:
    # 偏移一下
    dy, dx = y + x, y - x + n
    a = max(0, dy - r)
    c = min(2 * n - 1, dy + r)
    b = max(0, dx - r)
    d = min(2 * n - 1, dx + r)
    
    diff[a][b] += 1
    diff[a][d + 1] -= 1
    diff[c + 1][b] -= 1
    diff[c + 1][d + 1] += 1
    
res = 0
for i in range(nm):
    for j in range(nm):
        if i > 0:
            diff[i][j] += diff[i - 1][j]
        if j > 0:
            diff[i][j] += diff[i][j - 1]
        if i > 0 and j > 0:
            diff[i][j] -= diff[i - 1][j - 1]
            
        sy = (i + j - n) // 2
        sx = (i - j + n) // 2
        if (i + j - n) % 2 == 0 and 0 <= sy < n and 0 <= sx < n:
            if diff[i][j] % 2 == 1:
                res += 1
     
print (res)


方法二:对角线差分

后期补上



写在最后

alt

全部评论
sy = (i + j - n) // 2 sx = (i - j + n) // 2 这里为什么横纵坐标都要偏移
1 回复 分享
发布于 2024-06-03 15:43 重庆
https://ac.nowcoder.com/discuss/1314197?type=101&order=0&pos=1&page=0&channel=-1&source_id=1 佬邦邦QwQ
1 回复 分享
发布于 2024-06-01 20:20 河南
Orz
1 回复 分享
发布于 2024-06-01 13:05 湖北
Or2,膜拜大佬。
1 回复 分享
发布于 2024-05-31 22:40 浙江

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
评论
11
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务