洛谷P3396雜湊衝突

2022-07-22 05:21:12 字數 1054 閱讀 2480

題意:

給出長度為n的序列a1、a2、a3……an,進行m次操作:『a』操作輸入x、y,求序列中下標i%x==y的所有數的和;『c』操作輸入x、y,將ax的值改為y。

題解:題解真的非常神奇……思路是這樣的:

首先暴力的想法:

for(int i=y;i<=n;i+=x) ans+=a[i];
純暴力這樣是o(n^2)的。之後有o(1)求答案的預處理,預處理出每個數在下標%p時對答案的貢獻:

void

init()

}return;}

預處理然而,這個預處理的時間和空間複雜度都達到了o(n^2)……不過我們可以利用根號來進行優化:

void

init()

}return;}

根號預處理

這樣時間和空間的複雜度降到了o(n*sqrt(n))。

預處理後,對於詢問中模數小於等於sqrt(n)的,我們都可以o(1)解決;而對於我們沒有處理出的,即模數大於sqrt(n)的,我們知道序列裡對答案有貢獻的數不會超過sqrt(n)個,所以暴力求和,時間複雜度維持在o(sqrt(n))以下。

對於修改,暴力更新預處理的結果即可,複雜度維持在o(sqrt(n))以下。

所以總複雜度為o(n*sqrt(n))。

只能說根號還是很神奇的……

**:

#include#include

#define mxn 150000+1

#define mxm 150000+1

intn,m;

int a[mxn],ans[400][400

];char cmd[2

];int

x,y,size;

void

init()

}return;}

void

query()

return;}

void

change()

a[x]=y;

return;}

intmain()

return0;

}

**

洛谷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...

洛谷 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君會...