zoukankan      html  css  js  c++  java
  • 2019徐州网络赛 query

    题意:

    给定一个1-n的全排列  有m个询问l r    问l-r (包括l r)  之间有多少点对i j (i!=j )   使得 i j 互为倍数关系

    先预处理所有的点对 L R    在R位置放入L    

    然后树状数组遍历即可  当读到R的时候放入L即可

    #include<bits/stdc++.h>
    using namespace std;
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define ll long long
    #define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
    #define inf 0x3f3f3f3f
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    const int N=2e6+10;
    int n,m,t[N],a[N],pos[N],l,r,ans[N];
    void add(int x,int v){for(;x<=N-10;x+=x&-x)t[x]+=v;}
    int qsum(int x){int ans=0;for(;x;x-=x&-x)ans+=t[x];return ans;}
    vector<int>table[N];
    struct node{int id,l;};
    vector<node>qq[N];
    int main()
    {   
        cin>>n>>m;
        rep(i,1,n)
        {
            scanf("%d",&a[i]);pos[a[i]]=i;
        }
        rep(i,1,n)
        for(int j=2*a[i];j<=n;j+=a[i])table[max(pos[j],i)].push_back(min(pos[j],i));
    
        rep(i,1,m)
        scanf("%d%d",&l,&r),qq[r].push_back({i,l});
    
        rep(i,1,n)
        {
            for(auto v:table[i])add(v,1);
            for(auto v:qq[i])ans[v.id]=qsum(i)-qsum(v.l-1);
        }
        rep(i,1,m)
        printf("%d
    ",ans[i]);
        return 0;
    }
    View Code
  • 相关阅读:
    Android 统一配置依赖管理
    Android图片压缩工具MCompressor
    Android Studio 打包自定义apk文件名
    sourceTree的下载与安装
    Mac环境下SVN的配置和使用
    AndroidStudio环境搭建
    设计模式之策略模式
    设计模式之状态模式
    设计模式之观察者模式
    mysql 查询小demo
  • 原文地址:https://www.cnblogs.com/bxd123/p/11482514.html
Copyright © 2011-2022 走看看