1236:区间合并

时间:2021-08-12
本文章向大家介绍1236:区间合并,主要包括1236:区间合并使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

区间合并

 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     sec se1=s[be],se2=s[en];
13     if(be==en);
14     else if(be+1==en){
15         if(se1.b>=se2.a)se1.b=max(se1.b,se2.b);
16         else se1.a=0;//无效化
17     }else{
18         int mid=(be+en)/2;
19         if((se1=dac(be,mid)).a&&(se2=dac(mid+1,en)).a&&se1.b>=se2.a)
20             se1.b=max(se1.b,se2.b);
21         else se1.a=0;
22     }
23     return se1;
24 }
25 int cmp(sec x,sec y){
26     return x.a<y.a;
27 }
28 int main(){
29     int n;
30     cin>>n;
31     for(int i=1;i<=n;i++)scanf("%d%d",&s[i].a,&s[i].b);
32     sort(s+1,s+n+1,cmp);
33     sec se=dac(1,n);
34     if(se.a)printf("%d %d",se.a,se.b);
35     else cout<<"no";
36     return 0;
37 }

原文地址:https://www.cnblogs.com/sxrekord/p/interval_merging.html