NKOJ 3768 數列操作

2021-08-08 09:17:07 字數 2582 閱讀 8775

p3768 數列操作

問題描述

給出 n 個正整數數列 a[1..n],再給出乙個正整數 k,現在可以重複進行如下操作:

每次選擇乙個大於 k 的正整數 a[i],將 a[i]減去 1,選擇 a[i-1]或 a[i+1]中的乙個加上 1。

經過一定次數的操作後,問最大能夠選出多長的乙個連續子串行,使得這個子串行的每個數都不小於 k。

總共給出 m 次詢問,每次詢問給出的 k 不同,你需要分別回答。。

輸入格式

第一行兩個正整數 n 和 m  。               

第二行 n 個正整數,第 i 個正整數表示 a[i] 。

第三行 m 個正整數,第 i 個正整數表示第 i 次詢問的 k 。

輸出格式

共一行,輸出 m 個正整數,第 i 個數表示第 i 次詢問的答案。
輸入輸出樣例

樣例輸入 1

5 6             

1 2 1 1 5

1 2 3 4 5 6

樣例輸出 1

5 5 2 1 1 0
樣例輸入 2

6 4     

3 2 1 2 5 1

3 4 1 6

樣例輸出 2

2 1 6 0
資料範圍

對於 40%的資料, 1<=n<=100    1<=m<=50    

對於 100%的資料,1<=n<=300000 1<=m<=50a[i] <= 10^9 k <= 10^9

題目當中的操作其實可以轉化為:

對於區間[l,r],若sum[l,r]>=(r-l+1)*k,則該區間滿足要求 操作後每個數字不小於k

其實我們算的是 sum[l,r] - (r-l+1)*k 是否大於0

但是對於不同的區間[l,r],減去的(r-l+1)*k是不同的 這就很難處理了

對於區間[1,n] 求出最長的子區間[l,r] 滿足sum[l,r]>=0

這道題目就簡單多了

①求出字首和的單調遞減序列

②求出滿足sum[1,r]-sum[1,l]>0的 r-l 最大值

例如 區間元素為       1 -2 1 1 -4  1 2

那麼字首和為 1 -1 0 1 -3 -2 0

單調遞減序列 0(pos=0) -1 -3

於是在求r-l的最大值時 我們就列舉pos=7 -> pos=1

求出對於r 最小的單調序列的編號

pos=7時 單調佇列的當前編號為5,對應的字首和為-3

sum[7] - sum[5] = 0(第七個位置的字首和)-(-3)(第五個位置的字首和)=3>0

所以可以更新最大長度為 7-5+1=3

如此往復 即可得到對於7的最長序列為 7(pos=0的點sum=0->滿足條件)

為什麼我們只需要考慮單調佇列中的元素呢?

對於單調佇列中的任意兩個連續的下標 l,r 當天討論的點為 p

如果 sum[p]-sum[l]<0

那麼由於佇列的單調性 sum[p+k]>=sum[p] (p+k=sum[p]所以sum[p+k]也一定不滿足要求

反之 如果sum[p+k]滿足要求 那麼sum[p]也一定能滿足要求

答案是肯定的

我們可以把數列中的每乙個數字都減去 k

轉化後 我們求得等價於原來的

sum[l,r]-(r-l+1)k>= (r-l+1)k-(r-l+1)k

[黑色的字型即為減去的k們]

①要用long long(套路真的深)

②對於最長的滿足要求的序列即為原序列的特殊情況,我們應該把佇列中的第乙個元素位置賦值為0 sum[0]=0 (具體原因自己想想 當然你也可以先wa再想)

#include 

#include

using namespace std;

inline long long input()

long long n,m,res,k,top;

long long a[300123],sum[300123],s

q[300123];

int main()

for(long long i=n;i;i--)

printf("%d ",res);

}}

問題 A 數列操作

問題 a 數列操作 時間限制 1 sec 記憶體限制 128 mb 提交 63 解決 22 提交 狀態 討論版 命題人 quanxing edit testdata 題目描述 給定 n個數列,規定有兩種操作,一是修改某個元素,二是求子數列 a,b 的連續和。數列的元素個數最多 10萬個,詢問操作最多...

線段樹 數列操作

假設有一列數 1 i n 支援如下兩種操作 1 將 ak 的值加 d k,d 是輸入的數 2 輸出 as as 1 at s,t 都是輸入的數,s t 根據操作要求進行正確操作並輸出結果。輸入格式 輸入檔案第一行乙個整數n 0 n 100000 第二行為 n 個整數,表示 的初始值。第三行為乙個整數...

樹狀陣列 數列操作

題目描述 給定n個數列,規定有兩種操作,一是修改某個元素,二是求子數列 a,b 的連續和。數列的元素個數最多10萬個,詢問操作最多10萬次。輸入第一行2個整數n,m n表示輸入n個數列,m表示有m個操作 第二行輸入n個數列。接下來m行,每更好行有三個數k,a,b k 0表示求子數列 a,b 的和,k...