P3396 哈希冲突
比较巧妙的根号算法
将询问分成两类:模数<=len和>len的
对于第一类,开一个桶记录
对于第二类,暴力
时间复杂度(n+m)√n
代码:
#include<bits/stdc++.h> using namespace std; const int N=150005; const int M=400; int n,m; int a[N]; int len; int value[M][M]; inline void insert(int pos,int x){ for(int i=1;i<=len;i++){ value[i][pos%i]+=x; } } int main(){ scanf("%d%d",&n,&m); len=sqrt(n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),insert(i,a[i]); for(int i=1;i<=m;i++){ char c; int x,y; cin>>c; scanf("%d%d",&x,&y); if(c=='A'){ if(x<=len) printf("%d\n",value[x][y]); else{ int ans=0; for(int i=y;i<=n;i+=x){ ans+=a[i]; } printf("%d\n",ans); } } else{ insert(x,-a[x]); insert(x,y); a[x]=y; } } return 0; }