時空限制 1000ms / 128mb
題目描述
眾所周知,模數的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%的資料,有n<=1000,m<=1000.
對於60%的資料,有n<=100000.m<=100000.
對於100%的資料,有n<=150000,m<=150000.
保證所有資料合法,且1<=value[i]<=1000.
題目分析
以前好像說過自己打死也不寫分塊的…嗯真香
容易想到樸素的暴力,令i從y開始迭代,每次加x,把沿路的val[i]都加上
可以發現當x(模數)很大的時候迭代次數就會很少
假如x為n
\sqrt
n級別,這樣的迭代顯然也是o(n
)o(\sqrt)
o(n)的
從中得到啟發,可以預處理模數x不大於n
\sqrt
n的答案,這部分就可以o(1
)o(1)
o(1)回答ans
[p][
k]
ans[p][k]
ans[p]
[k]表示mod p時k池內的總和
for
(int i=
1;i<=n;
++i)
for(
int j=
1;j<=t;
++j)
ans[j]
[i%j]
+=a[i]
;
x大於n
\sqrt
n的部分直接暴力,複雜度也是o(n
)o(\sqrt)
o(n
)總複雜度o((
n+m)
n)
o((n+m)\sqrt)
o((n+m
)n)
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long lt;
intread()
while
(ss>=
'0'&&ss<=
'9')
return f*x;
}const
int maxn=
200010
;int n,m;
int a[maxn]
,ans[
510]
[510];
char ss[5]
;int
main()
else
if(ss[0]
=='a')}
}return0;
}
洛谷 P3396 雜湊衝突 分塊
題目鏈結 給你個數列,編號為1 n 1 n 給出兩種操作 我們先從最為暴力的思路出發 我們可以把要求的東西簡寫成su m x y sum x y 代表的含義是模 x x 餘y role presentation style position relative y y的編號對應的數字之和,下面我們需要...
洛谷P3396 雜湊衝突 分塊
給出乙個數列,其中第i i個數在mod pmod p下會被裝進第imo dpim odp個雜湊池。維護一下兩種操作 根號演算法好題。應該不算分塊吧。對於這道題,我們分開兩段維護 模數 t t 此時我們預處理出cnt p x cn t p x 表示在模p p下池x x的元素之和。每次詢問o 1 o 1...
洛谷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...