百度权重10的网站,WordPress 采集文章 图片,呼市做网站,企业网站平台如何做网络推广目录 前置知识进入正题实战演练 前置知识 给定区间 [ l, r ]#xff0c;让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做#xff1f;很简单#xff0c;差分一下即可
还不会的小伙伴点此进入学习 进入正题 … 目录 前置知识进入正题实战演练 前置知识 给定区间 [ l, r ]让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做很简单差分一下即可
还不会的小伙伴点此进入学习 进入正题 进阶一下 给定区间 [ l, r ]把数组[ l, r ] 区间中的数加上一个首项s、末项e、公差为d的等差数列, 即 a[ l ] s , a[ l 1 ] sd , a[ l 2 ] s2d ······a[ r ] e 怎么实现先给出结论
a[l] s a[l 1] d - s a[r 1] -d e a[r 2] e 再对a数组做两次前缀和即得到ans
为何 下面听我娓娓道来~ 简单举个例子 假设数组a【00000000】 现要求对 a[1] 到 a[5] 这5个数字 分别加上以s为首项d为公差e为末项的等差数列即a【0ssds2ds3ds4de00】 如何得到呢我们先做一次差分试试 diff1【0sdddd-e0】什么也看不出来对吧。 再对差分数组做差分 diff2【0sd-s000-e-de】 哎这不是一开始所进行的操作吗 a[1]s a[2]d-s a[6]-de a[7]e 一切终成闭环 好了实际运用的时候到了
实战演练 P4231 三步必杀 https://www.luogu.com.cn/problem/P4231 不了解异或运算可点此进入
题解code
n, m map(int, input().split())
ans [0] * (n 3)
for i in range(m):l, r, s, e map(int, input().split())d int((e - s) / (r - l))ans[l] sans[l 1] d - sans[r 1] - d eans[r 2] e # 实现等差数列差分for i in range(1, len(ans)):ans[i] ans[i - 1]
for i in range(1, len(ans)):ans[i] ans[i - 1] # 两次前缀和xor 0
for i in ans:xor ^ i
print(f{xor} {max(ans)})如果有更多问题或需要进一步的帮助可以在评论区留言讨论哦 如果喜欢的话请给博主点个关注 谢谢