原来lym学长这么健美嘛…
嗯…这是一道比较板的莫队了,稍微修改一下 和 即可。
对于 和 的话,我们只需要先减去原来的 ,然后进行相应的 修改,最后在加上 ,当然我们也可以把它展开,问题不大。
关键代码:
void Insert(LL X){
Tot-=Cnt[X]*Cnt[X];++Cnt[X];Tot+=Cnt[X]*Cnt[X];
}
void Delete(LL X){
Tot-=Cnt[X]*Cnt[X];--Cnt[X];Tot+=Cnt[X]*Cnt[X];
}
int main(){
...
LL Left=1,Right=0;
for(I=1;I<=T;I++){
while(Right<Ask[I].Y){
Insert(A[++Right]);
}
while(Right>Ask[I].Y){
Delete(A[Right--]);
}
while(Left<Ask[I].X){
Delete(A[Left++]);
}
while(Left>Ask[I].X){
Insert(A[--Left]);
}
Ans[Ask[I].Id]=Tot;
}
...
return 0;
}