

注解
1、前缀和。b[start]++,b[end+1]–,然后每次输出的就是前一个位数的数值加上此位数的数值,即a[i]=a[i-1]+b[i]。(这个思想非常巧妙,非常值得学习)
代码
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 100005;
int a[MAXN];
int b[MAXN];
int main() {
int N;
cin>>N;
while(N) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for(int i=0; i<N; i++) {
int s, e;
cin>>s>>e;
b[s]++;
b[e+1]--;
}
for(int i=1; i<=N; i++) {
a[i] = a[i-1]+b[i];
if(i==1) {
cout<<a[i];
} else {
cout<<" "<<a[i];
}
}
cout<<endl;
cin>>N;
}
return 0;
}
结果

本文深入探讨了前缀和算法的巧妙应用,通过增加开始位置的计数并减少结束位置后一位的计数,实现了一种高效的数据处理方法。代码示例展示了如何使用这种算法来处理区间更新问题,通过两次遍历数组,一次设置更新操作,一次计算前缀和,从而得到每个元素的最终值。这种方法特别适用于处理大规模数据集和频繁的区间修改操作。

被折叠的 条评论
为什么被折叠?



