1236:区间合并
因为题目明确说了a,b∈[1,10000],此时使用数组的状态来判断某个值是否在区间内,无疑是可行的。
但是如果题目的测试案例给的再恶心点(如50000个1,10000),复杂度应该就过不了。┭┮﹏┭┮
看到很多大佬也都是先对数组进行排序,遍历所有区间然后判断是否满足合并区间条件。
很可惜没有找到一份“分治”题解。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 const int N=10005; 6 int t[N]; 7 8 int main(){ 9 int n,a,b,mina=N,maxb=0; 10 cin>>n; 11 for(int i=0;i<n;i++){ 12 scanf("%d%d",&a,&b); 13 for(int i=a;i<=b;i++)t[i]=1; 14 if(mina>a)mina=a; 15 if(maxb<b)maxb=b; 16 } 17 int i=mina; 18 for(;i<=maxb;i++){ 19 if(!t[i]){ 20 cout<<"no"; 21 break; 22 } 23 } 24 if(i>maxb)cout<<mina<<" "<<maxb; 25 return 0; 26 }
自己使用分治只拿了40分Ծ‸Ծ,期待哪天二刷用得上!(掩耳盗铃、自欺欺人)
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 6 const int N=50005; 7 struct sec{ 8 int a,b; 9 }; 10 sec s[N]; 11 sec dac(int be,int en){ 12 if(be==en)return s[be]; 13 sec se1,se2; 14 int mid=(be+en)/2; 15 if((se1=dac(be,mid)).a&&(se2=dac(mid+1,en)).a&&se1.b>=se2.a) 16 se1.b=max(se1.b,se2.b); 17 else se1.a=0; 18 return se1; 19 } 20 int cmp(sec x,sec y){ 21 return x.a<y.a; 22 } 23 int main(){ 24 int n; 25 cin>>n; 26 for(int i=1;i<=n;i++)scanf("%d%d",&s[i].a,&s[i].b); 27 sort(s+1,s+n+1,cmp); 28 sec se=dac(1,n); 29 if(se.a)printf("%d %d",se.a,se.b); 30 else cout<<"no"; 31 return 0; 32 }