字首和是一種預處理,在之後的計算中直接應用前面已經算出的結果。
題目鏈結
有數字1-n,然後m個l,r查詢,構造乙個序列,使得查詢的區間和的和最大值;
輸出和。
思路:差分字首和求出每個數字被查詢的次數,然後sort排序,一次賦值n到1,最大的對應n
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
1e5+10;
//差分字首和演算法
ll vis[maxn]
, cnt[maxn]
;int
main()
for(
int i =
1; i <= n; i++
) ll sum =0;
sort
(vis+
1, vis+n+1)
;for
(int i = n; i >
0;i--
)printf
("%lld\n"
, sum)
;return0;
}
一維字首和:
s[i] = a[1]+a[2]+a[3]+…+a[n]
二維字首和
s[i][j] = a[i』][j』]的和(1<=i』<=i, 1<=j』<=j)
有一點像「矩陣的面積」那樣,把一整塊區域的值都加起來。
字首和用途
參考部落格1
參考部落格2
一般用來求字首和
一維:給出n個數的序列,要求回答m次詢問,每次詢問下標l到r的和。
樸素做法:每次都執行加和操作,輸出結果,顯然會超時。
超時的原因:重複計算。
改進方法:提前算好了每個位置的字首和,然後用s[r] - s[l],結果即為詢問的答案。
——這樣使得計算量大大減少,二維也是如此。
給定乙個長度為n的數列a,要求支援操作add(l ,r, val),表示對a[l]~a[r]的每個數加上val,並求修改之後的序列。
暴力顯然超時;
考慮差分做法。輔助陣列c,記錄某個位置上的總改變量;
c[i]表示i~n這些元素都加上c[i]這個數;
對[l, r]區間進行加值操作,在c[l]處加val,在c[r+1]處減val即可維護;
最後第i個位置改變了多少,只需要求一下c字首和即可
對於二維:
參考部落格
對於二維的情況,乙個n*m的矩陣,要求支援操作add(x1,y1,x2,y2,a),
表示對於以(x1,y1)為左下角,
(x2,y2)為右上角的矩形區域,
每個元素都加上a。
要求修改後的矩陣。
做法和一維類似:
用陣列c儲存總改變量
在c[x1][y1]處加上a,
在c[x2+1][y1]和c[x1][y2+1]處減a,
在c[x2+1][y2+1]再加上a。
最後(i,j)位置上的數值就是c陣列在(i,j)位置的字首和。
字首和演算法
什麼是字首和和字首積?字首和 字首積也稱字首和陣列,字首積陣列。給一陣列a,字首和 新建一陣列b,陣列中每一項b i 儲存a中 0 i 的和 字尾和 新建一陣列b,陣列中每一項b i 儲存a中 i n 1 的和 字首積 新建一陣列b,陣列中每一項b i 儲存a中 0 i 的積 字尾積 新建一陣列b,...
字首和演算法
例如 給定乙個陣列求某一區間 下標x到x y上 所有數字相加和為0,求這樣區間存在的個數 求某個區間上所有數相加為1這樣區間的個數 include using namespace std typedef long long ll define int ll map int,int mp void s...
python字首 python字首和演算法
我試圖理解字首和概念背後的思想,看看codity here 蘑菇揀選器問題 在字首和課程中給出的例子 我的理解是,整個概念是基於乙個簡單的屬性,即為了求陣列a的兩個位置a pos left,pos right 之間的所有元素的和,使用第二個陣列p,其中所有元素都是連續求和的,其中搜尋到的和計算為 值...