题意: 给出n(1e5)个操作, 每次操作让区间[l,r)内的数+1, 最后求最大的数是多少.
思路: 差分基础题...复习一下差分:
查分要把所有的操作离线, 保证最后才询问, 其实就是把所有的操作合并成一次操作, 在最后得到结果.
一维差分:
每次对a数组[l,r]加上x, 就是对于差分数组c, c[l]+=x, c[r+1]-=x.
先考虑只有一次操作时c数组求前缀和, 就会让区间内的数都受到+x的影响, 而当前缀和走到了r+1时, 这个影响又会被减过x的c[r+1]消除.
求完前缀和后,c[i]就是a[i]的变化量了.
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
int c[M];
int main(){
int n;
scanf("%d",&n);
int l,r;
int rr=0;
for(int i=0;i<n;i++){
scanf("%d%d",&l,&r);
c[l]++;c[r]--;
rr=max(rr,r);
}
for(int i=1;i<=rr+5;i++){
c[i]+=c[i-1];
}
int ans=0;
for(int i=0;i<=rr+5;i++){
ans=max(ans,c[i]);
}
printf("%d\n",ans);
return 0;
}