#15708:


qqrainbow (愛蜜莉雅)

學校 : 國立嘉義高級中學
編號 : 83319
來源 : [36.238.5.68]
最後登入時間 :
2023-04-26 23:31:35
b966. 3. 線段覆蓋長度 -- 2016年3月apcs | From: [36.239.64.89] | 發表日期 : 2018-10-21 19:54

先 排 序    <- 這 很 重 要 , 排 序 總 能 夠 簡 化 問 題

bool cmp(line a,line b)

{

     if(a.start==b.start) return a.end<b.end;

     return a.start<b.start;

}

sort(Lines.begin(),Lines.end(),cmp);

接 下 來 , 不 斷 在 Lines 裡 面 看 第 I 個 的 start 跟 end :

如 果 第 I 個 線 段 包 含 著 第 I + 1 個 線 段 的 start , 而 且 第 I + 1 個 線 段 的 end > 第 I 個 線 段 的 end

就 把 第 I 個 線 段 的 end 更 新 成 第 I + 1 個 線 段 的 end 。

如 果 沒 有 包 含 到

就 直 接 算 出 原 本 的 線 段 長 , 換 下 一 個 。

for(int i=0;i<N;i++)
{
    int s=arr[i].s,e=arr[i].e;
    while(i+1<N&&e>arr[i+1].s)
    {
         if(e<arr[i+1].e)
            e=arr[i+1].e;
         i++;
    }
    len+=e-s;
}

最 後 len 就 是 答 案

 
#17536: Re:解


willis2014 (//我凍齡)

學校 : 臺北市私立延平高級中學
編號 : 60208
來源 : [123.192.203.15]
最後登入時間 :
2024-10-03 11:20:11
b966. 3. 線段覆蓋長度 -- 2016年3月apcs | From: [140.122.107.165] | 發表日期 : 2019-04-19 21:15

先 排 序   

bool cmp(line a,line b)

{

     if(a.start==b.start) return a.end<b.end;

     return a.start<b.start;

}

sort(Lines.begin(),Lines.end(),cmp);

接 下 來 , 不 斷 在 Lines 裡 面 看 第 I 個 的 start 跟 end :

如 果 第 I 個 線 段 包 含 著 第 I + 1 個 線 段 的 start , 而 且 第 I + 1 個 線 段 的 end > 第 I 個 線 段 的 end

就 把 第 I 個 線 段 的 end 更 新 成 第 I + 1 個 線 段 的 end 。

如 果 沒 有 包 含 到

就 直 接 算 出 原 本 的 線 段 長 , 換 下 一 個 。

for(int i=0;i<N;i++)
{
    int s=arr[i].s,e=arr[i].e;
    while(i+1<N&&e>arr[i+1].s)
    {
         if(e<arr[i+1].e)
            e=arr[i+1].e;
         i++;
    }
    len+=e-s;
}

最 後 len 就 是 答 案



還是70%QQQQQQQQQQQQQQQQQQ

 
#17541: Re:解


ufve0704 (爬 我爬 我爬爬爬 有排行榜這種東西就是要爬 爬過我上面的那...)

學校 : 臺北市私立延平高級中學
編號 : 83268
來源 : [203.72.178.1]
最後登入時間 :
2023-10-30 13:02:50
b966. 3. 線段覆蓋長度 -- 2016年3月apcs | From: [203.72.178.252] | 發表日期 : 2019-04-20 07:43

先 排 序   

bool cmp(line a,line b)

{

     if(a.start==b.start) return a.end<b.end;

     return a.start<b.start;

}

sort(Lines.begin(),Lines.end(),cmp);

接 下 來 , 不 斷 在 Lines 裡 面 看 第 I 個 的 start 跟 end :

如 果 第 I 個 線 段 包 含 著 第 I + 1 個 線 段 的 start , 而 且 第 I + 1 個 線 段 的 end > 第 I 個 線 段 的 end

就 把 第 I 個 線 段 的 end 更 新 成 第 I + 1 個 線 段 的 end 。

如 果 沒 有 包 含 到

就 直 接 算 出 原 本 的 線 段 長 , 換 下 一 個 。

for(int i=0;i<N;i++)
{
    int s=arr[i].s,e=arr[i].e;
    while(i+1<N&&e>arr[i+1].s)
    {
         if(e<arr[i+1].e)
            e=arr[i+1].e;
         i++;
    }
    len+=e-s;
}

最 後 len 就 是 答 案



還是70%QQQQQQQQQQQQQQQQQQ

其實只要設定a[b]={1},

在將輸出的片段變為0,

在全部加起來。

 
#17710: Re:解


henrytsui000 (霸氣@浩堂 今年17歲 文教被死當)

學校 : 國立交通大學
編號 : 86611
來源 : [42.72.10.231]
最後登入時間 :
2022-08-14 18:08:59
b966. 3. 線段覆蓋長度 -- 2016年3月apcs | From: [140.113.136.221] | 發表日期 : 2019-05-08 09:52

先 排 序   

bool cmp(line a,line b)

{

     if(a.start==b.start) return a.end<b.end;

     return a.start<b.start;

}

sort(Lines.begin(),Lines.end(),cmp);

接 下 來 , 不 斷 在 Lines 裡 面 看 第 I 個 的 start 跟 end :

如 果 第 I 個 線 段 包 含 著 第 I + 1 個 線 段 的 start , 而 且 第 I + 1 個 線 段 的 end > 第 I 個 線 段 的 end

就 把 第 I 個 線 段 的 end 更 新 成 第 I + 1 個 線 段 的 end 。

如 果 沒 有 包 含 到

就 直 接 算 出 原 本 的 線 段 長 , 換 下 一 個 。

for(int i=0;i<N;i++)
{
    int s=arr[i].s,e=arr[i].e;
    while(i+1<N&&e>arr[i+1].s)
    {
         if(e<arr[i+1].e)
            e=arr[i+1].e;
         i++;
    }
    len+=e-s;
}

最 後 len 就 是 答 案



還是70%QQQQQQQQQQQQQQQQQQ

其實只要設定a[b]={1},

在將輸出的片段變為0,

在全部加起來。


樓上的作法會TLE吧(?

排序之後用減的幾乎是O(n)

複雜度比較好

 
ZeroJudge Forum