• 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 p1p<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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    样例输出 #1
    25
    41
    11
    
    • 1
    • 2
    • 3

    提示

    样例解释

    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 n1000 m ≤ 1000 m\leq 1000 m1000

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

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

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


    分块题

    #include 
    
    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
  • 相关阅读:
    webGIS轨迹移动案例(高德)
    全国核辐射检测数据月度表
    redis进阶:集群模式原理及搭建
    【23级红细胞招新模拟训练(部分题解 不包含最后三题】
    C# redis通过stream实现消息队列以及ack机制
    Scala的一等公民和至简原则
    中国储运杂志中国储运杂志社中国储运编辑部2022年第7期目录
    C ssh2 执行命令
    使用C#创建服务端Web API
    Week 5 Linear Models for Classification (Part A)
  • 原文地址:https://blog.csdn.net/lzh_Andy/article/details/132648650