luogu 3396 哈希冲突 奇怪的根号
这个题嘛开始一看实在想不出来有什么数据结构/算法可以乱搞,于是果断写了个朴素n方暴力,然后就发现luogu竟然有91分
这数据啊,也是醉了。。
想着优化优化能不能暴力卡过最后一个T掉的点,然鹅发现无耶
然后rxz的题解告诉我,(n+m)sqrt(n)的办法也是很骚,
算法思想可以看作一种::懒惰???不过这种玩意儿还是适合随机数据吧,要是大量使用肯定会被卡。
但是话说回来了,再卡也不就是的朴素暴力么,能有多差??
将处理的模数sqrt一下,预处理n sqrt(n)
若询问<=siz O(1)即可,若不在需要O(sqrt n)
在加上修改的m*sqrt(n),一共也就是个(n+m)*sqrt(n)
#include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #define ll long long using namespace std; const int M=151000; const int N=500; int siz,x,y,n,m,a[M]; ll ans[N][N];char opt; int main(){ scanf("%d%d",&n,&m); rep(i,1,n) scanf("%d",&a[i]); siz=sqrt(n); rep(i,1,n)rep(p,1,siz) ans[p][i%p]+=a[i]; rep(i,1,m){ cin>>opt;scanf("%d%d",&x,&y); if(opt=='A'){ if(x<=siz) printf("%lld\n",ans[x][y%x]); else{ll sum=0; for(int j=y%x;j<=n;j+=x) sum+=a[j];printf("%lld\n",sum);} }if(opt=='C'){ rep(p,1,siz) ans[p][x%p]=ans[p][x%p]+y-a[x];a[x]=y;} }return 0; }