小B的询问

这题在修改的时候略有不同,应当减去之前的贡献再加上此时的贡献。

就像这样:

void add(int x){
    now=now+2*cnt[a[x]]+1;
    cnt[a[x]]++;
}
void del(int x){
    cnt[a[x]]--;
    now=now-2*cnt[a[x]]-1;
}

那么我们不难写出代码。

记得要开LONG LONG!!!

看代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e5+10;
int n,m,k;
int a[maxn],cnt[maxn],ans[maxn],len,now;
struct node{
    int l,r,id,bl;
}q[maxn];
int cmp(node x,node y){
    if(x.bl==y.bl)return x.r<y.r;
    return x.bl<y.bl;
}
void add(int x){
    now=now+2*cnt[a[x]]+1;
    cnt[a[x]]++;
}
void del(int x){
    cnt[a[x]]--;
    now=now-2*cnt[a[x]]-1;
}
signed main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    len=sqrt(n)+1;
    for(int i=1;i<=m;i++){
        scanf("%lld%lld",&q[i].l,&q[i].r);
        q[i].bl=q[i].l/len;
        q[i].id=i;
    }
    sort(q+1,q+1+m,cmp);
    int l=1,r=0;
    for(int i=1;i<=m;i++){
        while(l<q[i].l)del(l++);
        while(l>q[i].l)add(--l);
        while(r>q[i].r)del(r--);
        while(r<q[i].r)add(++r);
        ans[q[i].id]=now;
    }
    for(int i=1;i<=m;i++)
        printf("%lld\n",ans[i]);
    return 0;
}

深深地感到自己的弱小。

posted @ 2020-03-11 22:12  syzf2222  阅读(108)  评论(0编辑  收藏  举报