Yandex.Algorithm 2011: Round 2 D. Powerful array(莫队)

 

 

给出 n 个数,m 此询问,求区间 [l,r] 内某个数 x 的 val,val 的定义为 :(x 在区间内出现的次数)^2 * x

题目链接:http://codeforces.com/problemset/problem/86/D 

用莫对维护所询问的区间即可,可以推一下假如一个数或删除一个数产生的贡献,或者直接暴力 

const int N=1e6+5;

    int i,j,k;
    int n,m,t;
    int a[N];
    struct Node
    {
        int id,bel;
        int l,r;
        bool operator<(Node o){
            return bel^o.bel? l<o.l : (bel&1? r>o.r : r<o.r );
        }
    }q[N];
    int block;
    ll cnt[N],ans[N],cur;

ll sqr(int x)
{
    return 1ll*x*x;
}

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

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

int main()
{
    //IOS;
    while(~sdd(n,m)){
        block=sqrt(n);
        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,q[i].bel=q[i].l/block;
        sort(q+1,q+1+m);
        int l=q[1].l,r=q[1].l-1; 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) del(r--);
            while(r<q[i].r) add(++r);
            ans[q[i].id]=cur;
        }
        for(int i=1;i<=m;i++){ write(ans[i]); puts(""); } 
    }
    //PAUSE;
    return 0;
}

 

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