ACM 251. [POI2001] 區間(掃描)

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章