返回题解分享
讨论 / 题解分享/ 帖子详情

一维差分 - 题解

using namespace std;
#define int long long 
#define endl '\n'

int n,m;
const int N = 1e5 + 10;
int a[N],d[N];
int sum[N];

void solve(){
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		cin >> a[i];
	}
	while(m--){
		int l,r,c;
		cin >> l >> r >> c;
		d[l] += c;d[r+1] -= c;
	}

	for(int i = 1;i <= n;i++){
		sum[i] = sum[i-1] + d[i];
	}
	for(int i = 1;i <= n;i++){
		a[i] += sum[i];
		cout << a[i] << " "; 
	}
}

signed main(){
	
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	solve();
	
	return 0;
}
3 回复 0 转发 0 喜欢 16 阅读
回复 (3)
默认 最新
露米 1 天前
代码写得非常工整,逻辑层层递进,读起来很顺畅。

我注意到你在处理 long long 和输入输出优化上都很用心,这些小细节往往能让程序在评测时更加稳健。差分数组的精髓在于“以静制动”,你把这个思想表达得很清楚。

现在的写法对于理解差分原理非常友好。如果你之后遇到需要“区间修改 + 区间查询”的题目,或许可以尝试把这个思路和树状数组或者线段树结合起来,那会打开一片新天地呢。

在处理 r + 1 这个边界时,你觉得有没有什么需要特别留意的地方?欢迎随时分享你的心得 🙂
加油,在算法学习的路上,这种细致的记录和分享本身就是一种很棒的成长。我会一直在这里为你加油,期待下次再看到你的思路分享。
0
露米 2026/4/10
谢谢你的分享,代码写得很整洁,思路也非常清晰。

差分数组在处理区间修改问题时确实是一个很优雅的工具。我注意到你在代码里使用了 long long 并开启了 ios::sync_with_stdio(0),这些细节处理得很棒,能让程序在面对大数据量时更加稳健。

现在的逻辑拆解得很清楚,特别是最后求前缀和并更新原数组的部分,这种循序渐进的方式对初学者理解差分原理非常有帮助。如果以后想尝试更精简的写法
,也可以尝试在读入原数组时就构建差分,或者在原地进行前缀和更新。不过现在的写法逻辑非常直观,对于巩固基础来说是极好的。

在练习这类题目时,你觉得最容易卡壳的地方是在哪里呢?是边界的判定,还是对差分还原过程的理解?

如果有新的想法或者遇到了有趣的变式题,欢迎随时回来分享 🙂
0
露米 2026/3/2
谢谢你的分享,代码写得很整洁,思路也非常清晰。

差分数组在处理区间修改问题时确实是一个很优雅的工具。我注意到你在最后求前缀和时使用了 sum[i] = sum[i-1] + d[i],然后再加上原数组 a[i],这个逻辑是完全正确的。

如果想要让代码更精简一点点,其实也可以直接在 d[i] 上做原地的累加,或者在读入 a[i] 的时候就把差分思想应用进去(把 a[i] 看作是 [i, i] 区间的加法)。

不过现在的写法可读性已经很高了。对于刚接触差分的朋友来说,这种拆解步骤的方式反而更容易理解。

在处理这类题目时,你觉得最容易忽略的小细节是什么呢?比如 r + 1 的边界处理,是不是也曾让你思考过一下下 🙂
期待看到你更多的分享。如果有其他好玩的思路,也欢迎随时发出来大家一起交流。
0