洛谷3396 雜湊衝突 題解

2022-05-16 14:08:23 字數 1497 閱讀 4424

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

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

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

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

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

保證1<=p

雜湊是騙你的。參考洛谷題解。

正解做法十分的妙,是一道參考集訓隊**《根號演算法——不只是分塊》出的**題。

首先暴力肯定是沒有前途的o(n)查詢。

預處理ans[p][x]表示p為模數時第x個池數的總和。

也是沒有前途的o(n^2)預處理。

所以如果沒有看過**的可能就不會往正解想(比如本蒟蒻),看到演算法標籤為分塊也會不知所以然。

正解:預處理ans[p][x]時p最大到sqrt(n)。

至於大於sqrt(n)的p我們可以暴力(最多隻會有sqrt(n)個數會被你查到)。

修改操作很傻就不說了。

總之我們做完了。

(然而這真的不是分塊emmm……這只是根號演算法……洛谷欺騙我感情。)

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=150001

;const

int sqrtn=401

;const

int lim=1000

;inline

intread()

while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return w?-x:x;

}char ch[10

];int

n,m,s,a[n];

int ans[sqrtn][lim+10

];inline

void

init()

}return;}

inline

int query(int p,int

x)inline

void modify(int x,int

y) a[x]=y;

}int

main()

return0;

}

洛谷3396 雜湊衝突 分塊

眾所周知,模數的hash會產生衝突。例如,如果模的數p 7,那麼4和11便衝突了。b君對hash衝突很感興趣。他會給出乙個正整數序列value。自然,b君會把這些資料存進hash池。第value k 會被存進 k p 這個池。這樣就能造成很多衝突。b君會給定許多個p和x,詢問在模p時,x這個池內數的...

洛谷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 雜湊衝突

分塊還真是應用廣泛啊.題意 求 解 以n0.5為界。當p小於n0.5的時候,直接用p 大小的陣列儲存答案。預處理n1.5,修改n0.5。當p大於n0.5的時候,直接按照定義計算,複雜度n0.5。所以總複雜度n1.5,實在是巧妙不堪啊.什麼sb詞彙 1 include 2 include 3 incl...