P3396 哈希冲突

原题链接

题解

正常暴力解法如下:

#include<bits/stdc++.h>
using namespace std;
int a[150007];
int main()
{
    int n,m;
    cin>>n>>m;

    for(int i=1;i<=n;i++) cin>>a[i];

    while(m--)
    {
        char op;
        cin>>op;
        int x,y;
        cin>>x>>y;
        if(op=='A')
        {
            int ans=0;
            for(int i=y;i<=n;i+=x) ans+=a[i];
            cout<<ans<<endl;
        }
        else a[x]=y;
    }
    return 0;
}

xn 时,时间复杂度 O(m)x1 时,时间复杂度 O(mn)
于是我们可以把当 x1 时的部分坐优化,先预处理出这些值,然后直接查询,分界点在 n ,当然在这题里分界点选其他值也可以,我选了以三为底的对数

code

#include<bits/stdc++.h>
using namespace std;
int a[150007];
int dp[400][400]={0};
int main()
{
    int n,m;
    cin>>n>>m;

    for(int i=1;i<=n;i++) cin>>a[i];
    int fenjie=log(n)/log(3);
    for(int k=1;k<fenjie;k++)
    {
        for(int i=1;i<=n;i++) dp[k][i%k]+=a[i];//每一个 a[i] 对应每一个k只有一个去处
    }//这一段的时间复杂度为n*sqrt(n)

    while(m--)
    {
        char op;
        cin>>op;
        int x,y;
        cin>>x>>y;
        if(op=='A')
        {
            int ans=0;
            if(x>=fenjie) for(int i=y;i<=n;i+=x) ans+=a[i];//O(sqrt(n))
            else ans=dp[x][y];//O(1)
            cout<<ans<<endl;
        }
        else
        {
            for(int k=1;k*k<=n;k++) dp[k][x%k]+=y-a[x];//O(sqrt(n))
            a[x]=y;
        }
    }

    //TOTAL:O(n*sqrt(n)+m*sqrt(n)+m)
    return 0;
}

posted @   纯粹的  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示