洛谷P5019 鋪設道路

2022-05-05 21:06:08 字數 2145 閱讀 9111

眾所周知,這道題和積木大賽是同一道題

題意就是給出一段自然數序列,每次操作\((l,r)\)把區間\([l,r]\)的數全部減一,不允許出現負數,問把序列變為零的最小操作次數

樣例

6   

4 3 2 5 3 5

大概長這個樣子

我們考慮第一列的四塊格仔,最少需要\(4\)次操作給消除掉

在考慮第二列的\(3\)個格仔時,發現都可以在第一列的\(4\)次操作中一起消除掉

第三列的格仔也都可以一起消除掉

考慮第四列,我們可以發現,第四列下面的兩個格仔在前面的操作中可以一起消除,但是上面的三個是至少再進行三次操作才能消除的

而第五列下面的兩個格仔在第一列的操作中可以消除,上面的乙個格仔可以在第四列的操作中刪除

考慮第六列,上面的\(2\)個格仔是前面操作消除不了的,需要\(2\)次操作

那麼答案就是\(4+3+2=9\)

這樣大概可以總結出做法:當\(a_時,\(ans+= a_i - a_\)

下面用差分序列給出這個貪心的證明:

我們對原序列\(\\)維護乙個差分陣列\(\\)

原序列不妨在最後加乙個\(0\),

6   

4 3 2 5 3 5 0

差分陣列是

4 -1 -1 3 -2 2 -5
每次操作可以表示為\(diff[l]--\),\(diff[r+1]++\)

最終的狀態就是差分陣列全部變成\(0\)

首先,每次操作最多讓乙個大於零的\(diff_i\)

\(-1\),所以 最優解\(ans>=sum(diff_i,diff_i>0)\)

下面要證明 \(ans=sum(diff_i,diff_i>0)\)

\(a_=0\) => \(sum(diff_i)=0\) => \(sum(diff_i,diff_i>0)+sum(diff_i,diff_i<0)=0\)

我們只要每次操作能讓乙個大於\(0\)的\(diff_i\)

\(-1\),同時後面乙個小於\(0\)的\(diff_i\)

\(+1\)才能夠使\(ans=sum(diff_i,diff_i>0)\)

然而有乙個限制條件:\(a_l\)~\(a_r\)之間沒有零 否則這個操作就是不合法的

我們可以利用以下性質構造解法:

性質1:由題意知任意時刻\(a_i>=0\),若\(diff_i>0\) 則\(a_i>a_>=0\),得\(a_i>0\)

性質2:由於\(a_=sum(diff_i)=0\),對於乙個大於零的\(diff_i\),\(sum(diff_\)~\(diff_)=a_i>0\),它的後面一定存在小於零的\(diff_i\)

於是有:每次選乙個大於零的\(diff_i\)作為操作的左端點\(l\),它右邊的第乙個小於零的\(diff_j\)作為\(r+1\),已知\(a_l>0\),\([l,r]\)中任意\(diff_k>=0\),可得任意\(a_k\)屬於\([l,r]\),\(a_k>=a_>=a_l>0\),因此該操作合法

所以存在至少一種操作方法可以在\(sum(diff_i,diff_i>0)\)次操作後使得\(diff\)序列全部為\(0\),\(ans=sum(diff_i,diff_i>0)\)

洛谷 P5019 鋪設道路

假設現在有乙個坑,但旁邊又有乙個坑,你肯定會選擇把兩個同時減1,那麼小的坑肯定會被大的坑 帶著 填掉。大的坑也會減少a i a i 1 的深度,可以說是白嫖減少了1,所以我們只需要遍歷整個陣列並加上a i 與a i 1 的差即可。include using namespace std define ...

洛谷 P5019 鋪設道路

洛谷傳送門 春春是一名道路工程師,負責鋪設一條長度為 nn 的道路。鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 nn 塊首尾相連的區域,一開始,第 ii 塊區域下陷的深度為 d id i 春春每天可以選擇一段連續區間 l,r l,r 填充這段區間中的每塊區域,讓其下陷深度減少 11。在選...

洛谷 P5019 鋪設道路

題面檢視 其實看到題目的第一想法其實是二分,每一次找乙個minx,再記錄它的pos,對於 l,pos 1 和 pos 1,r 繼續做,然後一看資料範圍,1 n 100000 立刻就否決了.其實在考場上說不定我就打70分了 然後我就開始對於資料進行模擬,突然靈光一閃,發現如果對於乙個坑x,forall...