1. 程式人生 > 其它 >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 }