P3396 哈希冲突 (分块)

本文介绍了一种处理大规模序列中模数查询与更新问题的高效算法,通过预处理和维护模数小于等于平方根n的和,实现快速查询与更新。对于模数大于平方根n的情况,则采用暴力循环策略,确保每次操作的时间复杂度可控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给定长度为n的序列a,现在要进行m次操作,操作有两种:
1.给定x,y,询问下标膜x等于y的所有位置的和
2.给定x,y,将a[x]修改为y

数据范围:n<=150000

解法:

令sq=sqrt(n)
预处理和维护模数小于等于sq的时候的答案
当模数大于sq的时候,暴力循环,循环次数不超过sq

code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=150000+5;
const int sq=400;
int f[sq+5][sq+5];//f[i][j]表示下标膜i等于j的位置的和
int a[maxm];
int n,q;
signed main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        for(int p=1;p<=sq;p++){
            f[p][i%p]+=a[i];
        }
    }
    while(q--){
        char op;cin>>op;
        int x,y;cin>>x>>y;
        if(op=='A'){//ask
            if(x<=sq){
                cout<<f[x][y]<<endl;
            }else{
                int ans=0;
                for(int i=y;i<=n;i+=x){
                    ans+=a[i];
                }
                cout<<ans<<endl;
            }
        }else if(op=='C'){//change
            for(int p=1;p<=sq;p++){
                f[p][x%p]-=a[x];
                f[p][x%p]+=y;
            }
            a[x]=y;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值