洛谷P3396 雜湊衝突 分塊

2021-09-14 02:56:54 字數 1863 閱讀 9295

時空限制 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...