zoukankan      html  css  js  c++  java
  • 2019 xtcpc C.Chika and Friendly Pairs

    http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=858&pid=1003

    莫队+bit维护

    先预处理+k -k位置 会跑快很多

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int maxn = 27000+5;
    int unit,tree[maxn],a[maxn],b[maxn],c1[maxn],c2[maxn];
    ll res[maxn];
    int id[maxn],len,k;
    struct node{
        int l,r,id;
    } p[maxn];
    bool cmp(const node u,const node v){
        if(u.l/unit==v.l/unit)
                return u.r<v.r;
        return u.l/unit<v.l/unit;
    }
    int lowbit(int x){
        return x&(-x);
    }
    void add(int x,int val){
        while(x<maxn){
            tree[x]+=val;
            x+=lowbit(x);
        }
    }
    ll ask(ll x)
    {
        ll sum=0;
        int l=lower_bound(b+1,b+1+len,x-k)-b+1;
        int r=upper_bound(b+1,b+1+len,x+k)-b+1;
        for(int i=r-1;i>0;i-=lowbit(i)) sum+=tree[i];
        for(int i=l-1;i>0;i-=lowbit(i)) sum-=tree[i];
        return sum;
    }
    int main()
    {
        int n,m;
        scanf("%d %d %d",&n,&m,&k);
        for(int i=1; i<=n; i++){
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        unit = sqrt(n);
        for(int i=1; i<=m; i++){
            scanf("%d %d",&p[i].l,&p[i].r);
            p[i].id=i;
        }
        sort(p+1,p+1+m,cmp);
        sort(b+1,b+1+n);
         len=unique(b+1,b+1+n)-(b+1);
        for(int i=1;i<=n;i++){
            id[i]=lower_bound(b+1,b+1+len,a[i])-b+1;
        }  
        int L=1,R=0;
        ll  ans=0;
        for(int i=1; i<=m; i++) {
            while(L<p[i].l) {
                ans-=ask(a[L])-1;
                add(id[L],-1);
                L++;
              }
              while(L>p[i].l) {
                L--;
                add(id[L],1);
                ans+=ask(a[L])-1;
            }
            while(R<p[i].r) {
                R++;
                add(id[R],1);    
                ans+=ask(a[R])-1;
            }
            while(R>p[i].r) {
                ans-=ask(a[R])-1;
                add(id[R],-1);
                R--;
            }
            res[p[i].id]=ans;
        }
        for(int i=1; i<=m; i++)
            printf("%I64d
    ",res[i]);
    }
    View Code
  • 相关阅读:
    extract numberic from text
    str.rfind("//")
    solr入门心得
    深挖洞,广积粮,缓称王
    ubuntu 查看文件夹大小

    关于托运
    iconv转换文件编码
    小毛小毛你的心态
    广积粮,高筑墙,缓称王
  • 原文地址:https://www.cnblogs.com/MengX/p/10889680.html
Copyright © 2011-2022 走看看