題目鏈結
給你個數列,編號為1…
n 1…n
。 給出兩種操作:
我們先從最為暴力的思路出發:
我們可以把要求的東西簡寫成su
m[x]
[y] sum
[x][
y]
,代表的含義是模
x x
餘y' role="presentation" style="position: relative;">y
y的編號對應的數字之和,下面我們需要來維護這個東西。
預處理:
for(int i = 1;i <= n;++i)
}
預處理su
m[x]
[y] sum
[x][
y]
的時間複雜度為o(
n2) o(n
2)
想要降低時間複雜度,我們可以想到分塊,分塊能降低到o(
nn‾√
) o(n
n)
做法如下:
我們對模數進行分塊,當模數
x√ x
<
n的時候,我們暴力與處理,時間複雜度為o(
nn‾√
) o(n
n)
。 當模數x
>n‾
√ x
>
n時候我們不將其處理。
詢問模數
x√ x
<
n時候,直接回答。
詢問模數
x>n‾
√ x
>
n時候,暴力按照a[
y]+a
[x+y
]+…+
a[kx
+y] a[y
]+a[
x+y]
+…+a
[kx+
y]
進行計算,由於
x>n‾
√ x
>
n,所以求和的數不超過nn
‾√n n個。
總的複雜度是
x>n‾
√ x
>n。
#include
#include
#include
using namespace std;
#define pr(x) cout<<#x<<":"int val[150007];
int dp[1007][1007];
int main()
for(int i = 1;i <= n;++i)
}char op;
intx,y;
for(int i = 0;i < m;++i)
printf("%d\n",ans);}}
else
val[x] = y;}}
return
0;}
洛谷P3396 雜湊衝突 分塊
時空限制 1000ms 128mb 題目描述 眾所周知,模數的hash會產生衝突。例如,如果模的數p 7,那麼4和11便衝突了。b君對hash衝突很感興趣。他會給出乙個正整數序列value。自然,b君會把這些資料存進hash池。第value k 會被存進 k p 這個池。這樣就能造成很多衝突。b君會...
洛谷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...