251. [POI2001] 區間
★☆ 輸入文件:prz.in
輸出文件:prz.out
簡單對比時間限制:1 s 內存限制:128 MB
有一些閉區間[ai,bi](i=1、2、…、n),找出區間數最少的表示方案,並按遞增的順序定稿輸出文件。當a≤b<c≤d時,我們說區間[a,b]和[c,d]爲遞增順序。
任務:
你的任務是編寫一個程序完成下列工作:
- 從文件中讀入這些區間;
- 算出滿足上述條件的區間;
- 把結果寫入文件。
輸入:
文件的第一行是整數n,3≤n≤50000,代表區間個數,以下第i+1行1≤i≤n,有兩個用空格分開的的整數ai和bi表示一個閉區間[ai,bi](1≤ai≤bi≤1000000)。
輸出:
文件包括,所求的不相交閉區間,每行描述一個閉區間,按照遞增順序。每個區間用兩個以空格分開的整數表示,分別是該區間的開頭和末端。
輸入樣例:
5 5 6 1 4 10 10 6 9 8 10
輸出樣例:
1 4 5 10
一遍掃描思路來自Byvoid遇到區間開始h+1,遇到結束h-1
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define INF 9999999
#define MAX_N 50000
#define MAX_M 1000001
int n;
struct Point
{
int pos;
bool start;
} pt[MAX_M];
bool cmp(const Point &a,const Point &b)
{
if(a.pos!=b.pos)
return a.pos<b.pos;
else
{
if(a.start)
return true;
else
return false;
}
}
int main()
{
freopen("prz.in","r",stdin);
freopen("prz.out","w",stdout);
int minx,maxx;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>pt[2*i].pos>>pt[2*i+1].pos;
pt[2*i].start=true;pt[2*i+1].start=false;
}
sort(pt,pt+n*2,cmp);
int n2=n*2;
int l=0;
int h=0;
for(int i=0;i<n2;i++)
{
if(pt[i].start)
h++;
else
h--;
if(h==1 && pt[i].start)
{
l=pt[i].pos;
}
else if(h==0)
{
cout<<l<<" "<<pt[i].pos<<endl;
}
}
return 0;
}