看这道题之前,我们先来看到气球着色问题.
气球着色题目大意:
有n(10^5)个气球,
m(10^5)次着色操作(对区间内的气球着色),后面跟着ai bi
q(10)次询问(询问某个气球着色次数).
最笨的思路是开一个sign[]数组,每次对区间内的sign[a~b]++;
这样的时间复杂度为O(n*m)近10^10,直接超时.
我们可以这样记录,开一个sign[]数组,对a~b着色的时候,sign[a]++,sign[b+1]--,着色完毕后,sum(sign[1~x])就是
第x个气球的着色数,时间复杂度为O(m).
例如
n=10,m=3
a: b:
1 5
3 6
4 8
sign 1 0 1 1 0 -1 -1 0 0 -1
sum 1 1 2 3 3 2 1 1 1 0 //sum[x]就为第x个气球着色数.
---------------------------------------------------------华丽的分割线---------------------------------------------------------
这题和杭电的 今年暑假不AC 很像,用贪心的话也能做,不过,这里用更简单的办法做:
接下来利用气球着色做这道题:
#include <stdio.h>
int fmax(int a,int b){return a>b?a:b;}
int main()
{
int n;
while(scanf("%d",&n) && n){
int sign[24*3600+10]={0};
int x,y;
for(int i=1;i<=n;++i){
scanf("%d %d",&x,&y);
sign[x]++;
sign[y+1]--;
}
int sum=0,m=0;
for(int i=0;i<=24*3600;++i){ //sum最大的那个就是所需要的天数
sum+=sign[i];
m=fmax(m,sum);
}
printf("%d\n",m);
}
return 0;
}