【題解】雜湊衝突
阿新 • • 發佈:2020-10-27
\(\text{Solution:}\)
題目大意是求,單點修改,\(\sum_{i=1}^n a[i][i\bmod x=y]\)
考慮根號分治:對\(x\)分類討論。
當\(x\leq \sqrt{n}\)時,設\(sum[i][j]\)表示模\(i\)為\(j\)的所有數之和。這一部分可以\(O(n\sqrt n)\)預處理,\(O(\sqrt n)\)修改。
當\(x>\sqrt{n}\)時,考慮暴力的複雜度:有效的\(pos\)只有\(\frac{n}{x}\)個,這一部分一定小於等於\(\sqrt{n}.\)
所以,總複雜度應為\(O((n+m)\sqrt n).\)
#include<bits/stdc++.h> using namespace std; int n,m; int sum[500][500],a[150001]; void solve(int x,int y){ int Ans=0; for(int i=y;i<=n;i+=x)Ans+=a[i]; printf("%d\n",Ans); } int main(){ scanf("%d%d",&n,&m); int N=sqrt(n)+1; for(int i=1;i<=n;++i)scanf("%d",&a[i]); for(int i=1;i<=N;++i){ for(int j=1;j<=n;++j){ sum[i][j%i]+=a[j]; } } while(m--){ int x,y; char c; cin>>c; scanf("%d%d",&x,&y); if(c=='A'){ if(x<=N)printf("%d\n",sum[x][y]); else solve(x,y); } else{ for(int i=1;i<=N;++i)sum[i][x%i]+=(y-a[x]); a[x]=y; } } return 0; }