代码拉取完成,页面将自动刷新
# -*- coding: utf-8 -*-
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/9/7
# @File : D - Snuke Prime(差分加离散化,只记录起点和终点).py
# 硬生生自己看明白的
def solve():
ans = 0
pre_sum = 0
l = 0
for key, value in d.items():
ans += min(C, pre_sum) * (key - l) # 不包括key的,5-2 = 3,有2 3 4,不包括5,因为key不是属于这一段的,(*)处,如果是其他段的a,那就更不属于这一段了。
l = key
pre_sum += value#其实就是模拟数组做法的前缀和,所以是累加 ,只不过只有每一段的第一个的值
return ans
if __name__ == '__main__':
"""
跟water heater那道题的思路一样,差分,给多个不同区间加上同一个数
但是这题需要用离散化,因为如果用数组会超内存,开不了那么大的数组,10**9数量级
因此需要使用字典来直接把起点和终点的下标存到key中,而value就存放在这个key上的加减变化。
起点和终点之间的段其实可以省略,最后计算的时候只需要乘以这一段的长度即可。因为你想象如果是用数组做,某两个(中间没有其他不是0的值的点)点之间都是的值0,所以这一段做前缀和是没有变化的
所以可以用这一段的起点的值乘以长度
至于为什么要排序,你想象如果是用数组做,不是用字典做,那你就会发现数组下标就是有序的。
都是闭区间,所以使用a和b+1
"""
n, C = map(int, input().split())
r = dict()
for _ in range(n):
a, b, c = map(int, input().split())
if (a in r):
r[a] += c
else:
r[a] = c
if (b + 1 in r): # (*)
r[b + 1] -= c
else:
r[b + 1] = -c
d = dict(sorted(r.items()))
ans = solve()
print(ans)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。