2019 xtcpc C.Chika and Friendly Pairs

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

莫队+bit维护

#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\n",res[i]);
}
View Code

猜你喜欢

转载自www.cnblogs.com/MengX/p/10889680.html
今日推荐