牛客 NC209881 名作之壁 單調佇列

2021-10-24 01:19:41 字數 1144 閱讀 3876

傳送門

給定乙個序列,求有多少個區間滿足區間最大值減區間最小值大於k。

可以從反面入手來解決這個問題,就是把答案變成區間個數減去區間最大值減最小值小於等於k的區間個數,求後者我們可以通過列舉區間的右端點找區間左端點有多少種可能的情況,然後累加起來就行了。我們可以發現如果區間[l,

r]

[l,r]

[l,r

] 滿足題意那麼區間[l+

1,r]

[l+1,r]

[l+1,r

]也滿足題意,所以我們只要對每乙個r

rr 求出最左邊的l

ll 使[l,

r]

[l, r]

[l,r

]滿足題意,那麼右端點為r

rr 的滿足條件的區間一共有r−l

+1

r - l + 1

r−l+

1個,累加起來即為答案。當然不可能暴力求l

ll,題目也不允許二分來求。通觀察可以發現每乙個r

rr對應的l

ll 是有單調性的,即r

rr移動到r+1

r+1r+

1,ll

l是不會向左移動的,這樣我們就可以由r

rr對應的l

ll 向右移動來得到r+1

r + 1

r+1對應的l

ll,非常類似於雙指標。 (其實就是雙指標)

由於ll

l最多移動n

nn次,所以演算法複雜度o(n

)o(n)

o(n)

,符合題目要求。

#include

using

namespace std;

dequeint,

int>> mi, ma;

const

int maxn =

1e7+5;

const

int mod =

1e9;

int n, k, a0, b, c;

int a[maxn]

;int

main()

ans -

=(r - l +1)

;}cout << ans << endl;

}

牛客NC18200烟花

總時間限制 1000ms 記憶體限制 262144k 小a有n個烟花,每個烟花代表著互不相同的顏色,對於第i個烟花,它有pi的概率點燃,現在小a要去點燃它們,他想知道產生顏色的期望個數及產生恰好產生k種顏色的概率 第一行兩個整數n,k.接下來一行n個數,第i個數pi表示第i個烟花被點燃的概率 輸出有...

牛客 NC15553 數學考試

思路 先把字首和求出來.類似於dp,當前節點為i的時候,我們要記錄下i之前的連續k個數和的最大值lmax.這就是第一段 然後讓j i k,讓rmax a j a i 這樣然後max max max,lmax rmax 這樣的複雜度是o n 看 include include include incl...

KMP 牛客 NC13253 子串

題目描述 給出乙個正整數n,我們把1 n在k進製下的表示連起來記為s n,k 例如s 16,16 123456789abcdef10,s 5,2 11011100101。現在對於給定的n和字串t,我們想知道是否存在乙個k 2 k 16 使得t是s n,k 的子串。輸入描述 第一行乙個整數n 1 n ...