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;
}

 

posted @ 2018-09-14 17:16  ASDIC减除  阅读(153)  评论(0编辑  收藏  举报