题解 AT1011 【AtColor】差分

jijidawang

2020-06-26 13:28:21

Solution

$n^2$ 肯定过不了百万所以差分裸题啊 差分的思路就是维护一个差分数组 $s$,每次 $[l,r]$ 区间覆盖就用 $s_l=s_l+1$,$s_{r+1}=s_{r+1}-1$。 对于 $s$ 做前缀和即可精准定位一个点的区间个数。 原理大概是前缀和中 $s_l$ 加了一后面全都加一了,$s_{r+1}$ 减一了就把后面全减一了导致 $[l,r]$ 全体加一的效果。 变成线性复杂度就肯定能过了。 Code: ```cpp #include<iostream> using namespace std; const int N=1000005; int s[N],l,r,n,sum,ans,maxnum; int main() { cin>>n; for (int i=0;i<n;i++) { cin>>l>>r; ++s[l]; --s[r+1]; // 差分操作 maxnum=max(maxnum,r+1); // 提前求出最大值使得不用求太多 max,这步优化可以不加,看数据范围能过 } for (int i=0;i<=maxnum;i++){sum+=s[i]; ans=max(ans,sum);} // 对每个点的区间个数求 max cout<<ans; return 0; } ```