題目描述 現給定n個閉區間[ai, bi],1<=i<=n。這些區間的並可以表示為一些不相交的閉區間的並。你的任務就是在這些表示方式中找出包含最少區間的方案。你的輸出應該按照區間的升序排列。這裡如果說兩個區間[a, b]和[c, d]是按照升序排列的,那麼我們有a<=b<c<=d。 請寫一個程式: ...
題目描述
現給定n個閉區間[ai, bi],1<=i<=n。這些區間的並可以表示為一些不相交的閉區間的並。你的任務就是在這些表示方式中找出包含最少區間的方案。你的輸出應該按照區間的升序排列。這裡如果說兩個區間[a, b]和[c, d]是按照升序排列的,那麼我們有a<=b<c<=d。
請寫一個程式:
讀入這些區間;
計算滿足給定條件的不相交閉區間;
把這些區間按照升序輸出。
輸入輸出格式
輸入格式:第一行包含一個整數n,3<=n<=50000,為區間的數目。以下n行為對區間的描述,第i行為對第i個區間的描述,為兩個整數1<=ai<bi<=1000000,表示一個區間[ai, bi]。
輸出格式:輸出計算出來的不相交的區間。每一行都是對一個區間的描述,包括兩個用空格分開的整數,為區間的上下界。你應該把區間按照升序排序。
輸入輸出樣例
輸入樣例#1:5 5 6 1 4 10 10 6 9 8 10輸出樣例#1:
1 4 5 10
一開始傻乎乎的用線段樹寫,寫了寫發現自己的線段樹貌似比暴力還要慢,於是看了看題解發現原來跑一邊掃描線就可以。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 const int MAXN=50001; 8 struct node 9 { 10 int bg,ed; 11 }a[MAXN]; 12 int n; 13 int comp(const node & a,const node & b) 14 { 15 return a.bg<b.bg; 16 } 17 int main() 18 { 19 ios::sync_with_stdio(false); 20 cin>>n; 21 for(int i=1;i<=n;i++) 22 cin>>a[i].bg>>a[i].ed; 23 sort(a+1,a+n+1,comp); 24 int l=a[1].bg; 25 int r=a[1].ed; 26 int now=1; 27 while(now++&&now<=n) 28 { 29 if(a[now].bg>r) 30 { 31 printf("%d %d\n",l,r); 32 l=a[now].bg; 33 r=a[now].ed; 34 } 35 r=max(a[now].ed,r); 36 } 37 printf("%d %d\n",l,r); 38 return 0; 39 }