• 初赛A轮


    数列互质

    时间限制:6秒

    空间限制:524288K

    给出一个长度为 n 的数列 { a[1] , a[2] , a[3] , ... , a[n] },以及 m 组询问 ( l[i] , r[i] , k[i])。
    求数列下标区间在 [ l[i] , r[i] ] 中有多少数在该区间中的出现次数与 k[i] 互质(最大公约数为1)。
    输入描述:
    第一行,两个正整数 n , m (1 ≤ n, m ≤ 50000)。
    第二行,n 个正整数 a[i] (1 ≤ a[i] ≤ n)描述这个数列。
    接下来 m 行,每行三个正整数 l[i] , r[i] , k[i] (1 ≤ l[i] ≤ r[i] ≤ n, 1 ≤ k[i] ≤ n),描述一次询问。


    输出描述:
    输出 m 行,即每次询问的答案。

    输入例子:
    10 5
    1 1 1 1 1 2 2 2 2 2
    4 7 2
    4 7 3
    4 8 2
    4 8 3
    3 8 3
    

    输出例子:
    0
    2
    1
    1
    0

    思路:A轮2题。。这题知道是莫队+数据结构,但是没学过莫队,就去学习了一发,然后最后半个小时太心急了,导致没拍完,。。我的T恤啊。。啊。。(另外写了的2题就不补了,心疼,莫队的板子套的是HZWER大佬的,谢谢大佬)

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=50004;
    int a[N];
    set<int >s;
    set<int >::iterator it;
    int ma[N];
    struct node{
        int l,r,x,xx;
        int block;
    }e[N];
    int c[N];
    bool cmp(node p,node q){
        if(p.block==q.block) return p.r<q.r;
        return p.block<q.block;
    }
    int gcd(int a,int b)
     {
        if(b==0)
            return a;
        return gcd(b,a%b);
     }
    int main(){
        int n,m;
        scanf("%d%d",&n,&m);
        int size=sqrt(n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].x);
            e[i].xx=i;
            e[i].block=(e[i].l-1)/size+1;
        }
        sort(e+1,e+1+m,cmp);
        int l=1,r=0;
        for(int i=1;i<=m;i++){
            int sum=0;
            while(l>e[i].l){l--;s.insert(a[l]);ma[a[l]]++;}
            while(r<e[i].r){r++;s.insert(a[r]);ma[a[r]]++;}
            while(l<e[i].l){
                    ma[a[l]]--;if(ma[a[l]]==0) s.erase(a[l]);l++;}
            while(r>e[i].r) {
                    ma[a[r]]--;if(ma[a[r]]==0) s.erase(a[r]);r--;}
            for(it=s.begin();it!=s.end();it++){
                if(gcd(ma[*it],e[i].x)==1){
                    sum++;
                }
            }
            c[e[i].xx]=sum;
        }
        for(int i=1;i<=m;i++)printf("%d
    ",c[i]);
        return 0;
    }
  • 相关阅读:
    Python批量 png转ico
    线性回归
    【论文集合】多语言机器翻译
    【论文集合】curriculum learning总结/课程学习论文
    crf++分词
    强化学习的探索策略方式
    关于multiprocessing中的logging的数据打印到本地失败或重复问题
    置信区间绘图、以10次平均值为例
    打印CSDN博客内容JS
    SUMO学习笔记(3)
  • 原文地址:https://www.cnblogs.com/hhxj/p/7047795.html
Copyright © 2020-2023  润新知