陣列上的詢問 字首和

2021-08-03 08:14:16 字數 1408 閱讀 1047

description

給出乙個有n個元素的陣列a,元素的值要麼是1,要麼是-1。

給出m次詢問,每次詢問的格式為:l, r,表示求s = a[l] + a[l+1] + ... + a[r]的值。若s 的值為0,輸出"yes",否則輸出"no"。

input

第1行:兩個整數n和m(1<=n, m <=100000)

第2行:n個空格分開的整數,表示陣列的各個元素,保證只含1和-1

接下來m行,每行兩個整數l,r(1 <=l <= r <=n),表示每個詢問的左右端點

output

共m行,對每個詢問,若和為0,輸出"yes",否則輸出"no"

sample input

5 5

-1 1 -1 1 -1

1 12 3

3 52 5

1 5

sample output

noyes

noyes

no

分析:第一眼看到了l,r,還以為是二分,然後仔細讀完題目,覺得好簡單,果斷開始模擬,交上去之後才發現

然後開始想怎麼節省時間,不可能再模擬了,此時我想到的居然是記憶化遞迴,扶額...好吧,我確實沒想到其他東西了,又不是搜尋,深搜超時改廣搜,於是去問老師,然後得解。

其實就是再另外找乙個陣列存和,舉個例子

陣列a來儲存那個陣列,s來存和,可以:

s[1]=a[1];

s[2]=s[1]+a[2];(前2數之和)

s[3]=s[2]+a[3];(前3數之和)

s[4]=s[3]+a[4];(前4數之和)

我們如果要求2~5,只用將s[5]-s[2-1]即可,s[5]-s[1]=a[1]+a[2]+a[3]+a[4]+a[5]-a[1]=a[2]+a[3]+a[4]+a[5]

是不是很神奇?所以只要學了知識,就能完成許多神奇的事情,知識改變命運          我是說了些什麼心靈雞湯麼

如果還沒有看懂的話,我們再舉個例子

我們如果要求3~6,只用將s[6]-s[3-1]即可,s[6]-s[2]=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]-a[1]-a[2]=a[2]+a[3]+a[4]+a[5]+a[6]

那麼,**奉上:(就不寫注釋啦,前面的看懂之後應該分分鐘秒殺啦 //分分鐘還秒殺?)

#include#includeint n,m,num[100005],s[100005],l,r;

int main()

}

陣列 字首和 字首積及其應用

字首和 字首積也稱字首和陣列,字首積陣列。給一陣列a,字首和 新建一陣列b,陣列中每一項b i 儲存a中 0 i 的和 字尾和 新建一陣列b,陣列中每一項b i 儲存a中 i n 1 的和 字首積 新建一陣列b,陣列中每一項b i 儲存a中 0 i 的積 字尾積 新建一陣列b,陣列中每一項b i 儲...

字首和 與 樹狀陣列

通常情況下,樹狀陣列可用來處理單點修改,區間查詢。通過字首和的轉換,可以使其處理區間修改和單點查詢。考慮原陣列和字首和陣列 修改原陣列的某個點 i 等價於 修改字首和陣列 的一條線段 1 i 都要修改 查詢原陣列的某條線段 1 i 等價於 查詢字首和陣列的乙個點 i 這樣,適當地處理字首和陣列和原陣...

演算法 陣列字首和處理

對於陣列和的處理 考慮i到j的和 為 sum j sum i 用來替代中間和 給定乙個整數陣列 a,返回其中元素之和可被 k 整除的 連續 非空 子陣列的數目。示例 輸入 a 4,5,0,2,3,1 k 5 輸出 7 解釋 有 7 個子陣列滿足其元素之和可被 k 5 整除 4,5,0,2,3,1 5...