SDOI2005 區間 解題報告

2021-08-21 11:59:39 字數 1310 閱讀 4659

傳送門:

現給定n個閉區間[ai, bi],1<=i<=n。這些區間的並可以表示為一些不相交的閉區間的並。你的任務就是在這些表示方式中找出包含最少區間的方案。你的輸出應該按照區間的公升序排列。這裡如果說兩個區間[a, b]和[c, d]是按照公升序排列的,那麼我們有a<=b請寫乙個程式:

讀入這些區間;

計算滿足給定條件的不相交閉區間;

把這些區間按照公升序輸出。

輸入格式:

第一行包含乙個整數n,3<=n<=50000,為區間的數目。以下n行為對區間的描述,第i行為對第i個區間的描述,為兩個整數1<=ai輸出格式:

輸出計算出來的不相交的區間。每一行都是對乙個區間的描述,包括兩個用空格分開的整數,為區間的上下界。你應該把區間按照公升序排序。

輸入樣例#1:複製

5

5 61 4

10 10

6 98 10

輸出樣例#1:複製

1 4

5 10

蒟蒻表示剛開始看到這題,連線段樹的想法都出來了。。

仔細想想,不對,這就是一道很簡單的貪心啊!

把區間左端點從小到大排一遍序,依次合併即可;合併的時候記錄當前右端點,判斷下乙個區間左端點是否在區間內,即是否《當前右端點,若在則合併,否則分開。

(這裡已經說得很直白了,建議自己思考或者先寫再看下面內容)

例如對於樣例,排序後:

1 45 6

6 98 10

10 10

首先區間為[1,4],右端點為4;

之後下個區間左端點5>4,不在當前區間內,則分開為[1,4],[5,6],當前右端點為6;

之後下個區間左端點6<=6,在當前區間內,合併,發現右端點9>6,需更新,則兩段區間為[1,4],[5,9],右端點為9;

之後下個區間左端點8<=9,在當前區間內,合併,發現右端點10>9,需更新,則兩段區間為[1,4],[5,10],右端點為10;

後面乙個區間就不用說了吧。

**真的很短,很簡單(其實思路也不難),不要想得太複雜了。

**:

#include#includeusing namespace std;

struct qhy

;int n,r;

qhy segment[50001];

bool cmp(qhy i,qhy j)

else if (segment[last].rprintf(" %d",segment[last].r);

}

NOI2016 區間 解題報告

最近思維好僵硬啊.一上來就覺得先把區間拆成兩個端點進行差分,然後掃瞄位置序列,在每個位置維護答案,用資料結構維護當前位置的區間序列,但是不會維護。於是想研究性質,想到為什麼要拿區間長度做權值呢,難道是有一些性質嗎 於是思考了很久區間長度的性質,猜了一些sb結論,比如什麼乙個區間只有加入時和刪除時的貢...

洛谷 P2434 SDOI2005 區間

現給定n個閉區間 ai,bi 1 i n。這些區間的並可以表示為一些不相交的閉區間的並。你的任務就是在這些表示方式中找出包含最少區間的方案。你的輸出應該按照區間的公升序排列。這裡如果說兩個區間 a,b 和 c,d 是按照公升序排列的,那麼我們有a b請寫乙個程式 讀入這些區間 計算滿足給定條件的不相...

洛谷 P2434 SDOI2005 區間

題目描述 現給定n個閉區間 ai,bi 1 i n。這些區間的並可以表示為一些不相交的閉區間的並。你的任務就是在這些表示方式中找出包含最少區間的方案。你的輸出應該按照區間的公升序排列。這裡如果說兩個區間 a,b 和 c,d 是按照公升序排列的,那麼我們有a b c d。請寫乙個程式 讀入這些區間 計...