洛谷P3396 雜湊衝突 根號複雜度演算法

2021-08-27 23:50:03 字數 947 閱讀 6131

我一開始打了個暴力,直接n^2列舉。。。看哪個同餘x,但是有個辦法能更快一點,複雜度取決於模數p。可以發現其實不用乙個個去檢驗哪個同餘x,因為是從1開始到n找出所有同餘x的正整數,由題意x一定小於等於p,所以所有和x模p同餘的整數就是x+k*p

從另乙個角度來說,做題的時候一定要從原本描述中抽象出核心含義,這道題問x池內的綜合,就是問所有模p同餘的下標對應的數之和(抽象出題意有助於幫助我們想起以前的知識,找到思路)

但是當p很小的時候複雜度仍然是n^2的,考慮到n的數量級是100000的,n*sqrt(n)的複雜度是可以過的。

先預處理出根號p以內的一些東西:設ans[p][k]表示在模p時(1 <= p < sqrt(n)),k池子(即所有%p同餘的下標對應數的和)的答案,那麼思考每個數的貢獻**換為算貢獻是個很常用的做法,一般讓統計滿足要求的數我們可以反過來求每個數的貢獻)

然後大於sqrt(n)的直接暴力統計,複雜度n*sqrt(n)

就是考慮每乙個a[i]能為什麼做貢獻,於是有:

for(int i=1; i<=n; i++) 

}

#include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 150000 + 10;

int n,m,q,a[maxn],ans[maxn][400];

int main()

int siz = sqrt(n);

for(int i=1; i<=n; i++)

}for(int i=1; i<=m; i++) else

} else

}return

0;}

洛谷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雜湊衝突

題意 給出長度為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 的。之後有...

洛谷 P3396 雜湊衝突 分塊

題目鏈結 給你個數列,編號為1 n 1 n 給出兩種操作 我們先從最為暴力的思路出發 我們可以把要求的東西簡寫成su m x y sum x y 代表的含義是模 x x 餘y role presentation style position relative y y的編號對應的數字之和,下面我們需要...