洛谷3396 雜湊衝突 分塊

2022-02-27 19:20:47 字數 1531 閱讀 2129

眾所周知,模數的hash會產生衝突。例如,如果模的數p=7,那麼4和11便衝突了。

b君對hash衝突很感興趣。他會給出乙個正整數序列value。

自然,b君會把這些資料存進hash池。第value[k]會被存進(k%p)這個池。這樣就能造成很多衝突。

b君會給定許多個p和x,詢問在模p時,x這個池內數的總和。

另外,b君會隨時更改value[k]。每次更改立即生效。

保證1<=p第一行,兩個正整數n,m,其中n代表序列長度,m代表b君的操作次數。

第一行,n個正整數,代表初始序列。

接下來m行,首先是乙個字元cmd,然後是兩個整數x,y。

若cmd='a',則詢問在模x時,y池內數的總和。

若cmd='c',則將value[x]修改為y。

對於每個詢問輸出乙個正整數,進行回答。

10 5

1 2 3 4 5 6 7 8 9 10

a 2 1

c 1 20

a 3 1

c 5 1

a 5 0

2541

11樣例解釋

a 2 1的答案是1+3+5+7+9=25.

a 3 1的答案是20+4+7+10=41.

a 5 0的答案是1+10=11.

資料規模

對於10%的資料,有n<=1000,m<=1000.

對於60%的資料,有n<=100000.m<=100000.

對於100%的資料,有n<=150000,m<=150000.

保證所有資料合法,且1<=value[i]<=1000.

越來越喜歡這樣的分塊演算法

我們考慮暴力:

對於查詢(p,x),從x號位開始,每次加p,統計對應位置的數

\(o(n^2)\)

何破?開陣列ans[p][x]表示模p為x的答案,查詢\(o(1)\),而預處理與空間都是\(o(n^2)\)

考慮分塊

觀察暴力的模式,每次加p,當p足夠大時所需次數其實很少【比如\(\sqrt\)】

我們就對\(\sqrt\)以內的p預處理,大於\(\sqrt\)的暴力

完美解決

#include#include#include#include#include#define ll long long int

#define rep(i,n) for (int i = 1; i <= (n); i++)

#define redge(u) for (int k = h[u],to; k; k = ed[k].nxt)

#define bug(s,n) for (int i = 1; i <= (n); i++) cout<57)

while (c >= 48 && c <= 57)

return out * flag;

}int ans[maxm][maxm],n,m,val[maxn],b;

int main()

while (m--)

}else

} return 0;

}

洛谷3396 雜湊衝突(大力分塊)

點此看題面 大致題意 給你乙個長度為n nn的陣列val valva l以及m mm個操作,操作有兩種 一種是將val xval x valx 修改為y yy,另一種操作是求出 va li i x y sum val i i x y vali i x y 樸素的暴力 我們先來寫乙個樸素的暴力,如下 ...

洛谷 P3396 雜湊衝突 分塊

題目鏈結 給你個數列,編號為1 n 1 n 給出兩種操作 我們先從最為暴力的思路出發 我們可以把要求的東西簡寫成su m x y sum x y 代表的含義是模 x x 餘y role presentation style position relative y y的編號對應的數字之和,下面我們需要...

洛谷P3396 雜湊衝突 分塊

時空限制 1000ms 128mb 題目描述 眾所周知,模數的hash會產生衝突。例如,如果模的數p 7,那麼4和11便衝突了。b君對hash衝突很感興趣。他會給出乙個正整數序列value。自然,b君會把這些資料存進hash池。第value k 會被存進 k p 這個池。這樣就能造成很多衝突。b君會...