眾所周知,模數的hash會產生衝突。例如,如果模的數雜湊是騙你的。參考洛谷題解。p=7
,那麼4
和11
便衝突了。b君對hash衝突很感興趣。他會給出乙個正整數序列
value
。自然,b君會把這些資料存進hash池。第
value[k]
會被存進(k%p)
這個池。這樣就能造成很多衝突。b君會給定許多個
p
和x
,詢問在模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...