1 Star 1 Fork 0

bensonrachel/Atcoder_algorithm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
D - Snuke Prime(差分加离散化,只记录起点和终点).py 1.88 KB
一键复制 编辑 原始数据 按行查看 历史
# -*- 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)
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/bensonrachel/atcoder_algorithm.git
git@gitee.com:bensonrachel/atcoder_algorithm.git
bensonrachel
atcoder_algorithm
Atcoder_algorithm
master

搜索帮助