【题解】哈希冲突

题目戳我

\(\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;
}
posted @ 2020-10-27 17:20  Refined_heart  阅读(87)  评论(0编辑  收藏  举报