P3396 题解

P3396 哈希冲突

题目背景

众所周知,模数的 hash 会产生冲突。例如,如果模的数 p = 7 p=7 p=7,那么 4 4 4 和 11 11 11 便冲突了。

题目描述

B 君对 hash 冲突很感兴趣。他会给出一个正整数序列 value \text{value} value。

自然,B 君会把这些数据存进 hash 池。第 value k \text{value}_k valuek 会被存进 ( k   m o d   p ) (k \bmod p) (kmodp) 这个池。这样就能造成很多冲突。

B 君会给定许多个 p p p 和 x x x,询问在模 p p p 时, x x x 这个池内 数的总和

另外,B 君会随时更改 value k \text{value}_k valuek。每次更改立即生效。

保证 1 ≤ p < n {1\leq p<n} 1≤p<n。

输入格式

第一行,两个正整数 n n n, m m m,其中 n n n 代表序列长度, m m m 代表 B 君的操作次数。

第一行, n n n 个正整数,代表初始序列。

接下来 m m m 行,首先是一个字符 cmd \text{cmd} cmd,然后是两个整数 x , y x,y x,y。

  • 若 cmd = A \text{cmd}=\text{A} cmd=A,则询问在模 x x x 时, y y y 池内 数的总和

  • 若 cmd = C \text{cmd}=\text{C} cmd=C,则将 value x \text{value}_x valuex 修改为 y y y。

输出格式

对于每个询问输出一个正整数,进行回答。

样例 #1

样例输入 #1
复制代码
10 5
1 2 3 4 5 6 7 8 9 10
A 2 1
C 1 20
A 3 1
C 5 1
A 5 0
样例输出 #1
复制代码
25
41
11

提示

样例解释

A 2 1 的答案是 1+3+5+7+9=25

A 3 1 的答案是 20+4+7+10=41

A 5 0 的答案是 1+10=11

数据规模

对于 10 % 10\% 10%的数据,有 n ≤ 1000 n\leq 1000 n≤1000, m ≤ 1000 m\leq 1000 m≤1000。

对于 60 % 60\% 60% 的数据,有 n ≤ 100000 n\leq 100000 n≤100000, m ≤ 100000 m\leq 100000 m≤100000。

对于 100 % 100\% 100% 的数据,有 n ≤ 150000 n\leq 150000 n≤150000, m ≤ 150000 m\leq 150000 m≤150000。

保证所有数据合法,且 1 ≤ v a l u e i ≤ 1000 1\leq \mathrm{value}_i \leq 1000 1≤valuei≤1000。


分块题

cpp 复制代码
#include <bits/stdc++.h>

#define int long long
#define mid (l+r)>>1
#define ls rt<<1,l,mid
#define rs rt<<1|1,mid+1,r
#define forz(i,a,b) for(int i=(a);i<=(b);++i)

const int maxn=2e5+100;
const int maxm=450;

inline int read()
{
    int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
	    if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
	    x=(x<<3)+(x<<1)+c-'0';
		c=getchar();
	}
	return x*f;
}

int a[maxn];
int dp[maxm][maxm];

signed main()
{
	std::cin.tie(0);
	std::cout.tie(0);
	int n=read(),m=read();
	int s=sqrt(n);
	for (int i=1;i<=n;i++) a[i]=read();
	for (int i=1;i<=n;i++) for (int j=1;j<=s;j++) dp[j][i%j]+=a[i];
	while (m--) 
	{
		char op;std::cin>>op;
		if(op=='A')
		{
			int x=read(),y=read();
			if(x>s)
			{
				int ans=0;
				for (int i=y;i<=n;i+=x) ans+=a[i];
				printf("%lld\n",ans);
			}
			else printf("%lld\n",dp[x][y]);
		}
		else
		{
			int x=read(),y=read();
			for (int i=1;i<=s;i++) dp[i][x%i]+=(y-a[x]);
			a[x]=y;
		}
	}
	return 0;
}
相关推荐
Django强哥15 分钟前
JSON Schema Draft-07 详细解析
javascript·算法·代码规范
AndrewHZ16 分钟前
【图像处理基石】GIS图像处理入门:4个核心算法与Python实现(附完整代码)
图像处理·python·算法·计算机视觉·gis·cv·地理信息系统
杨小码不BUG44 分钟前
蛇形舞动:矩阵填充的艺术与算法(洛谷P5731)
c++·算法·矩阵·csp-j/s·循环控制
MicroTech20251 小时前
微算法科技(NASDAQ:MLGO)开发延迟和隐私感知卷积神经网络分布式推理,助力可靠人工智能系统技术
人工智能·科技·算法
草莓熊Lotso1 小时前
《C++ STL list 完全指南:从基础操作到特性对比,解锁链表容器高效用法》
开发语言·c++·list
Boop_wu2 小时前
[数据结构] Map和Set
java·数据结构·算法
要一起看日出2 小时前
数据结构------二叉查找树
数据结构·二叉查找树
繁星星繁2 小时前
C++11学习笔记
c++·笔记·学习
思考的笛卡尔3 小时前
密码学基础:RSA与AES算法的实现与对比
网络·算法·密码学
Stanford_11067 小时前
如何利用Python进行数据分析与可视化的具体操作指南
开发语言·c++·python·微信小程序·微信公众平台·twitter·微信开放平台