思路:
脑抽了,一看题目,这不就是线段树么,离散化区间合并。。最终发现我并不会写。。。于是看了下题目范围10^6。。。模拟水之。。每个区间左端点+1,右端点-1,从左到右扫一下就行了。。。
代码:
1 /* 2 ID:xu baoqi 3 LANG:C++ 4 TASK:milk2 5 */ 6 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10 #include <iostream> 11 #include <vector> 12 #include <queue> 13 #include <cmath> 14 #include <set> 15 using namespace std; 16 17 #define N 1000005 18 19 20 int a[N]; 21 int n; 22 23 main() 24 { 25 // freopen("milk2.in","r",stdin); 26 // freopen("milk2.out","w",stdout); 27 int i, j, k; 28 scanf("%d",&n); 29 memset(a,0,sizeof(a)); 30 int len=0; 31 int minh=2000005; 32 for(i=0;i<n;i++){ 33 scanf("%d %d",&j,&k); 34 len=max(len,k); 35 minh=min(j,minh); 36 a[j]++;a[k]--; 37 } 38 for(i=minh+1;i<=len;i++) a[i]+=a[i-1]; 39 40 int ans1, ans2; 41 j=k=0; 42 ans1=ans2=0; 43 for(i=minh;i<=len;i++){ 44 if(a[i]){ 45 j++;if(k)ans2=max(ans2,k);k=0; 46 } 47 else{ 48 k++;if(j)ans1=max(ans1,j);j=0; 49 } 50 } 51 printf("%d %d\n",ans1,ans2); 52 }