题意:定义K[x]为元素x在区间[l,r]内出现的次数,那么它的贡献为K[x]*K[x]*x

给定一个序列,以及一些区间询问,求每个区间的贡献

算是莫队算法膜版题,不带修改的

Code

#include <cstdio>
#include <algorithm>
#include <cmath>
#define N 200010
#define ll long long
using namespace std; int n,m,A[N],bl[N],k[N*5];
ll sum,Ans[N];
struct info{
int l,r,id;
friend bool operator <(info a,info b){
return (bl[a.l]==bl[b.l])?a.r<b.r:a.l<b.l;
}
}q[N]; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} void upd(int x,int d){
sum-=k[A[x]]*1ll*k[A[x]]*A[x];
k[A[x]]+=d;
sum+=k[A[x]]*1ll*k[A[x]]*A[x];
} int main(){
n=read(),m=read();int blo=sqrt(n);
for(int i=1;i<=n;++i) A[i]=read(),bl[i]=i/blo+1;
for(int i=1;i<=m;++i) q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+m+1);
for(int i=1,l=1,r=0;i<=m;++i){
for(;l<q[i].l;++l) upd(l,-1);
for(;l>q[i].l;--l) upd(l-1,1);
for(;r<q[i].r;++r) upd(r+1,1);
for(;r>q[i].r;--r) upd(r,-1);
Ans[q[i].id]=sum;
}
for(int i=1;i<=m;printf("%lld\n",Ans[i++]));
return 0;
}

最新文章

  1. 微信小程序--火车票查询
  2. CLLocationManagerDelegate不调用didUpdateLocations (地图)
  3. [转帖]DAS、NAS、SAN、iSCSI 存储方案概述
  4. webdriver 获取元素焦点方法
  5. Andriod Studio Clear Project或Rebuild Project出错
  6. Word Pattern | &amp; II
  7. 杭JS
  8. Oracle内存管理理论篇二
  9. c缺陷与陷阱笔记-第一章 词法陷阱
  10. 基于嵌入式的c语言连接器
  11. 锋利的Jquery解惑系列(三)------ 各路选择器大聚会
  12. (转)25个增强iOS应用程序性能的提示和技巧--高级篇
  13. Steve Yegge:Google面试秘籍
  14. @synchronized(self)
  15. python学习:输出九九乘法表
  16. laravel表单操作
  17. Python的二叉树实现
  18. Activity-Flag标志位
  19. zoc license code
  20. java中文显示乱码的解决方式

热门文章

  1. css透明边框实现
  2. u-boot分析(九)----nand flash初始化|nand flash读写分析
  3. staticmethod classmethod property方法
  4. Struts2_动态结果集
  5. Java 开发23种设计模式
  6. 关于java@Override错误
  7. Linux安装中文字体包
  8. OpenGL学习 Introduction
  9. 命令行输入Jmeter提示不是内部或外部命令,处理方式:添加环境变量
  10. java运行顺序-JVM之九