1. 程式人生 > >【洛谷】P2434 [SDOI2005]區間(暴力)

【洛谷】P2434 [SDOI2005]區間(暴力)

輸入輸出 pre spa scan break 輸入格式 我們 return 描述

題目描述

現給定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
------------------------------------------------------------
分析:洛谷tag有毒啊,因為“線段樹”進來的,最後用暴力A的。
  言歸正傳,無非是線段掃描,註意設置數組時上限別設置true。附上醜陋的代碼。
 1 #include <cstdio>
 2
#include <algorithm> 3 using namespace std; 4 int q[1000005]; 5 int main() 6 { 7 int n,a,b,maxnum=-1,minnum=1<<9; 8 scanf("%d",&n); 9 for(int i=1;i<=n;i++) 10 { 11 scanf("%d%d",&a,&b); 12 maxnum=max(maxnum,b); 13 for(int
i=a+1;i<=b;i++) q[i]=1; 14 } 15 for(int i=1;i<=maxnum;i++) 16 { 17 if(q[i]==1) 18 { 19 int begin=i-1; 20 for(int j=i;j<=maxnum+1;j++) 21 { 22 if(q[j]==0) 23 { 24 i=j; 25 printf("%d %d\n",begin,j-1); 26 break; 27 } 28 } 29 } 30 } 31 return 0; 32 }

【洛谷】P2434 [SDOI2005]區間(暴力)