傳送門:
現給定n個閉區間[ai, bi],1<=i<=n。這些區間的並可以表示為一些不相交的閉區間的並。你的任務就是在這些表示方式中找出包含最少區間的方案。你的輸出應該按照區間的公升序排列。這裡如果說兩個區間[a, b]和[c, d]是按照公升序排列的,那麼我們有a<=b請寫乙個程式:
讀入這些區間;
計算滿足給定條件的不相交閉區間;
把這些區間按照公升序輸出。
輸入格式:
第一行包含乙個整數n,3<=n<=50000,為區間的數目。以下n行為對區間的描述,第i行為對第i個區間的描述,為兩個整數1<=ai輸出格式:
輸出計算出來的不相交的區間。每一行都是對乙個區間的描述,包括兩個用空格分開的整數,為區間的上下界。你應該把區間按照公升序排序。
輸入樣例#1:複製
5輸出樣例#1:複製5 61 4
10 10
6 98 10
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。請寫乙個程式 讀入這些區間 計...