zoukankan      html  css  js  c++  java
  • 初赛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;
    }
  • 相关阅读:
    UVa532 Dungeon Master 三维迷宫
    6.4.2 走迷宫
    UVA 439 Knight Moves
    UVa784 Maze Exploration
    UVa657 The die is cast
    UVa572 Oil Deposits DFS求连通块
    UVa10562 Undraw the Trees
    UVa839 Not so Mobile
    327
    UVa699 The Falling Leaves
  • 原文地址:https://www.cnblogs.com/hhxj/p/7047795.html
Copyright © 2011-2022 走看看