洛谷P2709 小B的询问(莫队)

 

const int N=5e4+5;

    int i,j,k;
    int n,m,t;
    int a[N];
    int num,block,bel[N];
    int ans[N],cnt[N],cur;
    struct Node
    {
        int id;
        int l,r;
    }q[N];

bool cmp(Node a,Node b)
{
    return bel[a.l]^bel[b.l] ? a.l<b.l : (bel[a.l]&1 ? a.r<b.r : a.r>b.r);
}

void build()
{
    block=sqrt(n);
    num=n/block; if(n%block) num++;
    for(int i=1;i<=num;i++){
        int l=block*(i-1)+1;
        int r=min(block*i,n);
        for(int j=l;j<=r;j++) bel[j]=i;
    }
}

void add(int pos)
{
    int x=a[pos];
    cur-=cnt[x]*cnt[x];
    cnt[x]++;
    cur+=cnt[x]*cnt[x];
}

void del(int pos)
{
    int x=a[pos];
    cur-=cnt[x]*cnt[x];
    cnt[x]--;
    cur+=cnt[x]*cnt[x];
}

int main()
{
    //IOS;
    while(~sddd(n,m,k)){
        for(int i=1;i<=n;i++) sd(a[i]);
        for(int i=1;i<=m;i++) sdd(q[i].l,q[i].r),q[i].id=i;
        build(); sort(q+1,q+1+m,cmp);
        int l=1,r=0; cur=0;
        for(int i=1;i<=m;i++){
            while(l>q[i].l) add(--l);
            while(l<q[i].l) del(l++);
            while(r<q[i].r) add(++r);
            while(r>q[i].r) del(r--);
            ans[q[i].id]=cur;
        }
        for(int i=1;i<=m;i++) pd(ans[i]);
    }
    //PAUSE;
    return 0;
}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页