思路
看上去就是一道简单的线段树的应用,区间更新,单点查询,但直接做却超时了。
找优化方法的时候得到了另一种方法,利用数组来进行解决。
我们都知道如果只解决区间求和问题的时候,可以直接对数组进行处理,
处理
for(int i=1; i<=n; i++) ans[i] += ans[i-1];
查询
result = ans[right] - ans[left-1];
同样的,如果我们要对区间 [a, b] 进行涂色,如果我们在 ans[a] 处加 1,然后对数组也进行如上的处理,那么这个加 1 的效果就会一直持续在 a 后面的所有区间,但我们只需要 [a, b]段,所以我们将 ans[b-1] -1, 那么加 1的效果就会在这里中断。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 100000;
int ans[maxn+10];
int main()
{
int n, a, b, re;
while(scanf("%d", &n)&&n)
{
memset(ans, 0, sizeof ans);
for(int i=1; i<=n; i++)
{
scanf("%d%d", &a, &b);
ans[a]++;
ans[b+1]--;
}
re = 0;
for(int i=1; i<=n; i++)
{
re += ans[i];
printf("%d%c", re, " \n"[i==n]);
}
}
return 0;
}