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...