博客
关于我
CodeForces - 361C A - Levko and Array Recovery 思维
阅读量:804 次
发布时间:2023-04-04

本文共 2044 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要根据Levko的操作记录,重建一个可能的初始数组,使得在执行这些操作之后,数组的结果与记录一致。我们可以通过逆向处理每个操作来确定最终的初始数组。

方法思路

  • 初始化数组:我们将初始数组所有元素初始化为一个非常大的值(例如 (10^{18})),这样在处理逆操作时不会有溢出或错误的情况。
  • 逆向处理操作:从最后一个操作开始逆向处理每个操作:
    • 对于类型1的操作(增加),我们需要反向操作,即减去增量。
    • 对于类型2的操作(找最大值),我们需要确保区间中的最大值等于给定的值。具体来说,我们遍历区间,检查每个元素是否大于给定的值,如果大于,则将其调整为给定的值。
  • 调整数组范围:在逆向处理所有操作之后,我们需要确保数组中的每个元素的绝对值不超过 (10^9)。
  • 验证结果:为了确保结果正确,我们可以正向处理一次所有操作,检查结果是否与记录一致。
  • 解决代码

    import sys
    def main():
    n, m = map(int, sys.stdin.readline().split())
    ops = []
    for _ in range(m):
    parts = list(map(int, sys.stdin.readline().split()))
    ops.append(parts)
    a = [10**18] * (n + 1) # 1-based indexing
    for i in range(m-1, -1, -1):
    t, l, r, val = ops[i]
    if t == 1:
    for j in range(l, r + 1):
    a[j] -= val
    else:
    current_max = max(a[l:r+1])
    if current_max > val:
    for j in range(l, r + 1):
    if a[j] > val:
    a[j] = val
    # Adjust to the constraints
    for i in range(1, n+1):
    if a[i] > 1e9:
    a[i] = int(1e9)
    elif a[i] < -1e9:
    a[i] = int(-1e9)
    # Verify the operations
    flag = True
    for i in range(m):
    t, l, r, val = ops[i]
    if t == 1:
    for j in range(l, r + 1):
    expected = a[j] + val
    if expected != a[j]:
    flag = False
    break
    if not flag:
    break
    else:
    max_val = max(a[l:r+1])
    if max_val != val:
    flag = False
    break
    if not flag:
    print("NO")
    else:
    print("YES")
    print(' '.join(map(str, a[1:])))
    if __name__ == "__main__":
    main()

    代码解释

  • 读取输入:首先读取输入的大小 n 和操作数量 m,然后读取所有的操作并存储在 ops 列表中。
  • 初始化数组:创建一个长度为 n+1 的数组 a,初始值为 (10^{18})。
  • 逆向处理操作:从最后一个操作开始,逐步处理每个操作。对于类型1的操作,减去增量;对于类型2的操作,调整区间内的最大值。
  • 调整数组范围:确保数组中的每个元素的绝对值不超过 (10^9)。
  • 验证结果:正向处理一次所有操作,检查结果是否与记录一致。如果有任何不一致,输出 "NO";否则,输出 "YES" 和重建后的数组。
  • 通过这种方法,我们可以准确地重建满足所有操作条件的初始数组。

    转载地址:http://wbrfk.baihongyu.com/

    你可能感兴趣的文章