題解 春荔 貪心

2022-09-05 04:00:12 字數 1004 閱讀 3197

有乙個長度為 \(n\) 的非負整數序列 \(a_i\),每次可以選擇一段區間減去 \(1\),要求選擇的區間長度 \(\in[l,r]\),問最少多少次把每個位置減成 \(0\)。

不保證有解,\(1 \leq l \leq r \leq n \leq 10^6,\ r - l + 1 \geq \lceil \frac \rceil,\ 0 \leq a_i \leq 10^9\)。

首先由於每次是對一段區間操作,考慮先差分原序列得到 \(c_i=a_i-a_(i\in[1,n+1])\)。

先從費用流的角度考慮。

源往正權點連權值的流量,負權點往匯連權值的流量,乙個可操作區間則表示為,將 \(i\) 與 \(\in[i+l,i+r]\) 中的點連流量為 inf,費用為 \(1\) 的邊。

跑最小費用最大流。沒流滿則無解,否則費用即要求的答案。

怎麼優化呢,考慮到這題有個特殊性質 \(\ r - l + 1 \geq \lceil \frac \rceil\),也就是說,對於任意滿足 \(j>i+r\) 的位置,也只需要 \(2\) 的費用即可從 \(i\) 到 \(j\) 流 \(1\) 的流量。

於是就貪心地考慮,對於正權點 \(i\) ,先對於只要 \(1\) 的費用的位置從後往前盡量流,然後再流費用為 \(2\) 的位置,如果有正權點或者負權點最後沒有滿流,就無解。

int main()

if(c[i] > sum)

ans += c[i] * 2, sum -= c[i], c[i] = 0;

} while(!q.empty() && i + r == q.back()) sum -= c[q.back()], q.pop_back();

} if(q.size() || sum)

printf("%lld\n", ans);

return 0;

}// sto zhy12138 orz

培訓貪心題解

在第乙個城市加滿,之後每到乙個城市加一公升油,直到滿足最低油耗量。注意有可能在第乙個城市就超過最低油耗量。include using namespace std int main 使用k次最大值的表情,再使用一次第二大值的表情,迴圈直到m次。include using namespace std l...

題解 辯論 貪心

看到這道題我秒想了網路流,搞了下沒出來,發現是個簡單的貪心,不難想。設a b a,ba,b表示支援議題1 11的人數和支援議題2 22的人數,沒選乙個就把對應的 1,1 1,1 1,1 author galaxy yr lang c created time 2019年10月24日 星期四 08時0...

貪心 ddl(題解)

題意 zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。思路 貪心的思想 因為每一項作業完成需要的時間相同,所以先完成分數多的扣的分越少,為了完成盡可能...