题目链接
看这道题之前,我们先来看到气球着色问题.
气球着色题目大意:
有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 2 3 4 5 6 7 8 9 10
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; }