1. 问题背景与需求分析
在牧场管理中,我们经常需要处理牛群的身高信息。假设有一排编号从1到N的牛,其中第P头牛的身高为H。现在给定M对关系(A,B),表示牛A和牛B能够互相看见(即它们之间的所有牛都比它们矮)。我们的目标是确定所有牛的可能的最高身高。
这个问题看似简单,但直接暴力求解会面临时间复杂度高的问题。我们需要找到一个高效的算法来处理大规模数据(比如N和M都可能达到10^4级别)。这就是差分算法大显身手的地方。
提示:差分算法特别适合处理这种区间修改问题,它可以将O(N)的区间操作降为O(1)的端点操作,最后通过前缀和还原结果。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 差分算法核心思想解析
2.1 什么是差分数组
差分数组是一种辅助数组,它记录的是原始数组中相邻元素的差值。对于原始数组a[],其差分数组d[]定义为:
- d[1] = a[1] - a[0](假设a[0]=0)
- d[i] = a[i] - a[i-1] (i > 1)
通过差分数组,我们可以高效地进行区间增减操作。例如要给区间[L,R]的每个元素加上k,只需要:
- d[L] += k
- d[R+1] -= k
2.2 为什么差分适合这个问题
在这个问题中,每对(A,B)关系实际上定义了一个区间[A+1,B-1],这个区间内的牛都必须比A和B矮。使用差分数组可以高效地记录这些区间约束:
- 初始化所有牛的身高为H(最高可能值)
- 对于每个(A,B)关系,将区间[A+1,B-1]的牛身高减1
- 最后通过前缀和还原实际身高
这种方法的优势在于:
- 区间修改时间复杂度O(1)
- 最终还原时间复杂度O(N)
- 总体复杂度O(N+M),远优于暴力方法的O(N*M)
3. 代码实现详解
3.1 数据预处理
cpp复制map<pair<int,int>,bool>mp;
for (int i=0;i<m;i++) {
int x,y;
scanf("%lld%lld",&x,&y);
if (x>y)swap(x,y);
mp[make_pair(x,y)]=1;
}
这里使用map来存储关系对,并自动去重。注意:
- 确保x < y,统一处理区间
- 自动过滤重复关系,避免重复操作
