題意:
給出長度為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預處理然而,這個預處理的時間和空間複雜度都達到了o(n^2)……不過我們可以利用根號來進行優化:init()
}return;}
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君會...