這篇主要是來介紹字首和的qaq。
字首和有一維的和二維的,一維的很容易理解,高中數學必修5第二章數列給出了前n項和的概念,就是字首和。一維的我們在這裡簡單說一句。
一維字首和
預處理:在輸入乙個數列的時候累加
查詢區間和:查詢[i,j]區間全部元素的和--sum[j]-sum[i-1]
二維字首和
預處理:用到了容斥原理的知識。即求矩陣左上角的頂點與當前點所圍成的矩形所覆蓋的權值。
設f為字首和陣列,則f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j]
查詢區間和:
對於乙個邊長為r的正方形,以(i,j)作為右下角的,那它矩陣中的和為
s[i][j]-s[i-r,j]-s[i,j-r]+s[i-r,j-r]
放兩道例題跑(
例題1 [hnoi2003]雷射炸彈
字首和+列舉邊長
1 #include2 #include3view codeusing
namespace
std;
4int
n,r,ans;
5int f[5090][5090];6
intmain()7
15for(int i=1;i<=5001;i++)
16for(int j=1;j<=5001;j++)
1720
for(int i=0;i<=5000-r;i++)
21for(int j=0;j<=5000-r;j++)
2226 printf("%d"
,ans);
27return0;
28 }
例題2 最大正方形
可能是隱藏在dp標籤下的乙個叛徒這題我覺得用字首和最簡單,而且還是01矩陣,只要預處理出字首和然後列舉最大正方形的邊長大小,再看矩陣中權值和是否等於邊長*邊長即可。以及注意邊界問題。
1 #include2 #include3view code4using
namespace
std;56
intn,m,ans;
7int f[200][200];8
9int
main()
1018
for(int i=1;i<=n;i++)
19for(int j=1;j<=m;j++)
20for(int k=1;k<=max(n,m);k++)
2127 printf("%d"
,ans);
28return0;
29 }
*update on 10-18
noip2014無線網路發射器選址
二維字首和裸題,當然也可直接列舉中心統計。
但是發現自己字首和這理解可能有點問題hhh。
其實是這樣的qwq。(當然變數名不能用x1y1之類的啦)
1 #include2 #include3 #include4view code5using
namespace
std;
6 typedef long
long
ll;7
8int
d,n;
9ll tot,ans;
10 ll w[500][500
];11
12int
main()
1322
for(int i=0;i<=128;i++)
23for(int j=0;j<=128;j++)
24 w[i][j]+=w[i-1][j]+w[i][j-1]-w[i-1][j-1
];25
for(int i=0;i<=128;i++)
26for(int j=0;j<=128;j++)
2739 printf("
%lld %lld
",tot,ans);
40return0;
41 }
序列 樹上差分小結 By cellur925
首先我們需要注意一下的是,差分比較適用於修改比較多而查詢比較少的情況。借教室 這是一道二分答案,在check函式中用到差分技巧的一道題,譬如說我們要把乙個序列中 l,r 區間都加上乙個權值,我們可以把在 l 處加上這個值,在r 1處減去這個值,再對記錄權值的陣列求字首和,那麼我們就可以得到這個真正的...
字首和演算法 一維字首和 二維字首和
輸入乙個長度為n的整數序列。接下來再輸入m個詢問,每個詢問輸入一對l,r。對於每個詢問,輸出原序列中從第l個數到第r個數的和。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數,表示整數數列。接下來m行,每行包含兩個整數l和r,表示乙個詢問的區間範圍。輸出格式 共m行,每行輸出乙個詢問的結果。資...
字首和 (1)什麼是字首和和一維字首和
字首和 prefix sum 的定義為 對於乙個給定的數列 a,它的字首和數列 s 是通過遞推能求出來得 例如 假設陣列a和字首和陣列s都已經定義 int i 初始條件 a 0 0 s 0 0 for i 1 i n i 下面我們用乙個模板題,將完整的一維陣列字首和做乙個簡單的展示。題目鏈結 inc...