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 }

 

posted @ 2021-08-12 11:29  Rekord  阅读(400)  评论(0编辑  收藏  举报