1 条题解

  • 0
    @ 2025-10-22 18:08:48

    题解

    题目分析

    这是一道算法题目,需要根据具体题目要求进行求解。

    解题思路

    1. 问题分析

    • 仔细阅读题目描述,理解题目要求
    • 分析输入输出格式和约束条件
    • 确定需要使用的算法和数据结构

    2. 算法选择

    • 根据题目特点选择合适的算法
    • 考虑时间复杂度和空间复杂度
    • 确保算法能正确处理所有测试用例

    3. 实现要点

    • 注意边界条件的处理
    • 优化输入输出以提高效率
    • 确保代码的正确性和鲁棒性

    4. 调试和优化

    • 使用测试用例验证算法正确性
    • 分析性能瓶颈并进行优化
    • 确保代码能通过所有测试点

    注意事项

    • 仔细处理数据类型和精度问题
    • 注意数组越界和空指针问题
    • 确保算法的时间复杂度符合要求
    #include<bits/stdc++.h>
    #define reg register
    // #define int long long
    inline int read(){
        reg int x=0,k=1; reg char ch=getchar();    
        while (ch<'0'||ch>'9') (ch=='-')&&(k=-1),ch=getchar();
        while ('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=getchar();
        return x*k;
    }
    const int N=1e6+10;
    int n,m,q,pos[N],cnt[N][21],a[N];
    int f[N],val[N],Cnt[30];
    std::vector<int> vc[N];
    int L,R;
    inline int get(reg int x){
        for (reg int i=20;i;i--) if (cnt[x][i]) return i+1;
        return 1;
    }
    inline void upd(reg int x,reg int F,reg int v){
        for (auto it:vc[x]) if (pos[it]&&pos[it]<pos[x]) 
            cnt[it][F]+=v;
    }
    inline void getans(){for (reg int i=20;i;i--) if (Cnt[i]) return printf("%d %d\n",i,Cnt[i]),void();}
    inline void insl(reg int x){
        memset(cnt[x],0,sizeof(cnt[x]));
        for (reg int i=x+x;i<=m;i+=x) if (pos[i]) 
            cnt[x][f[i]]++;
        Cnt[f[x]=get(x)]++,val[--L]=x,pos[x]=L; 
    }
    inline void dell(){Cnt[f[val[L]]]--,pos[val[L]]=0,L++;}
    inline void insr(reg int x){
        Cnt[f[x]=1]++,val[++R]=x,pos[x]=R,upd(x,1,1);
        memset(cnt[x],0,sizeof(cnt[x]));
        for (auto it:vc[x])if (pos[it]){
            reg int his=f[it]; f[it]=get(it);
            if (f[it]!=his){
                Cnt[his]--,Cnt[f[it]]++;
                upd(it,his,-1),upd(it,f[it],1);
            }
        }
    }
    inline void delr(){
        Cnt[f[val[R]]]--,upd(val[R],f[val[R]],-1);
        // std::cerr<<"<< "<<val[R]<<" "<<f[val[R]]<<"\n";
        for (auto it:vc[val[R]])if (pos[it]){
            reg int his=f[it]; f[it]=get(it);
            if (f[it]!=his){
                Cnt[his]--,Cnt[f[it]]++;
                upd(it,his,-1),upd(it,f[it],1);
            }
        }
        pos[val[R]]=0,R--;
    }
    signed main(){ 
        n=read(),m=read(),q=read();
        for (reg int i=1;i<=n;i++) a[i]=read();
        for (reg int i=m;i;i--) for (reg int j=i+i;j<=m;j+=i) 
            vc[j].push_back(i);
        R=100003+n,L=R+1;
        for (reg int i=n;i;i--) insl(a[i]);
        // std::cerr<<"<< "<<f[1]<<" "<<f[2]<<" "<<f[3]<<" "<<Cnt[6]<<"\n";
        getans();
        while (q--){
            reg int op=read();
            if (op==0) insl(read());
            else if (op==1) insr(read());
            else if (op==2) dell();
            else delr();
            getans();
        }
        return 0;
    }
    
    • 1

    信息

    ID
    3778
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者