题目:
题目链接:[LUOGU 哈希冲突]
题解:
一看到是rxz大佬的题目,,就上去做了做,但是,,为什么挂出来分块的标签,但是呢,,,,跟分块,,一点关系都没有啊!!!!!
不瞎扯了,,,进入正题,,,
先解释一下题面:
就是给你一串数,对于标号进行操作,标号取模得x的,把他给的数的劝权值进行取和。
就是
n
n
n\sqrt{n}
nn进行预处理,之后的可以
O
(
1
)
O(1)
O(1)处理
n
\sqrt{n}
n之前的答案,然后就
n
n
n\sqrt{n}
nn处理之后的答案就好了,这样的话就是
n
n
n\sqrt{n}
nn了。
(这都是什么解法啊,,,,竟然还写分块的标签,,,,)
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0')s=s*10+ch-'0',ch=getchar();
return s*w;
}
const int sea=1e5+5e4+7;
const int pool=500;
int n,m,block,a[sea],ans[sea][pool];
int main()
{
n=read();m=read(); block=pow(n,0.33);
for(int i=1;i<=n;i++)
{
a[i]=read();
for(int j=1;j<=block;j++) ans[j][i%j]+=a[i];
}
while(m--)
{
char ch; cin>>ch;
int x=read(),y=read();
if(ch=='A')
{
if(x<=block) printf("%d\n",ans[x][y]);
else
{
int sum=0;
for(int i=y;i<=n;i+=x) sum+=a[i];
printf("%d\n",sum);
}
}
else{for(int i=1;i<=block;i++) ans[i][x%i]-=(a[x]-y);a[x]=y; }
}
return 0;
}