1. 程式人生 > >Codeforces 1042 D Petya and Array

Codeforces 1042 D Petya and Array

1.題意

給出一個數組,元素有正有負有0,問其區間和大於K的子區間的個數。

2.解法

若直接求所有區間和,有n^2個狀態,顯然是要直接略過一些狀態。 對這類問題,解決方法一般是排序——利用單調性,在處理到某個狀態時不和要求,則其後的狀態也不合要求,continue。

對於本題,有個技巧:我們運用二分。對於[l,r]之間的子區間,我們只考慮跨越區間中點mid的子區間。 首先,我們要從mid開始向左構造字尾和suf,向右構造字首和pre,進而通過任意的suf+pre產生一個區間和。 然後,我們把suf和pre們按照升序排序。 道理是很清晰的,既然任一suf+任一pre都能產生一個經過mid的子區間的區間和,我們必然希望讓suf和pre都儘可能小,直到suf+pre達到閾值K——那餘下的suf+pre也必然大於K,便不做考慮。

核心思路就是利用單調性忽略部分狀態。

3.程式碼

注意有數字超過INT_MAX,要用longlong。