An array of positive integers a1, a2, ..., an is
given. Let us consider its arbitrary subarray al, al + 1..., ar,
where 1 ≤ l ≤ r ≤ n. For every positive integer s denote
by Ks the
number of occurrences of s into the subarray. We call the power of
the subarray the sum of productsKs·Ks·s for
every positive integer s. The sum contains only finite number of nonzero summands as the number of different values in the array is
indeed finite.

You should calculate the power of t given subarrays.

Input

First line contains two integers n and t (1 ≤ n, t ≤ 200000)
— the array length and the number of queries correspondingly.

Second line contains n positive integers ai (1 ≤ ai ≤ 106)
— the elements of the array.

Next t lines contain two positive integers lr (1 ≤ l ≤ r ≤ n)
each — the indices of the left and the right ends of the corresponding subarray.

Output

Output t lines, the i-th
line of the output should contain single positive integer — the power of the i-th query subarray.

Please, do not use %lld specificator to read or write 64-bit integers in C++. It is preferred to use cout stream
(also you may use%I64d).

Sample test(s)
input
3 2
1 2 1
1 2
1 3
output
3
6
input
8 3
1 1 2 2 1 3 1 1
2 7
1 6
2 7
output
20
20

20

这题也是用莫队算法,类型和前面小Z的袜子基本一样。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std; struct Query
{
int id, l, r;
long long ans;
}; const int MAXN = 200010;
const int MAXNUM = 1000010;
int n, m, sqrtn;
int c[MAXN], num[MAXNUM];
Query q[MAXN]; int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
} bool cmplr(const Query &a, const Query &b)
{
if (a.l / sqrtn == b.l / sqrtn) return a.r < b.r;
else return a.l < b.l;
} bool cmpid(const Query &a, const Query &b)
{
return a.id < b.id;
} int main()
{
scanf("%d%d", &n, &m);
sqrtn = (int)sqrt(n);
memset(num, 0, sizeof(num));
for (int i = 1; i <= n; i++)
scanf("%d", &c[i]);
for (int i = 0; i < m; i++)
{
q[i].id = i;
scanf("%d%d", &q[i].l, &q[i].r);
}
sort(q, q + m, cmplr);
int l = 1, r = 1;
long long ans = c[1];
num[c[1]]++;
for (int i = 0; i < m; i++)
{
while (r < q[i].r)
{
r++;
ans -= (long long)num[c[r]] * num[c[r]] * c[r];
num[c[r]]++;
ans += (long long)num[c[r]] * num[c[r]] * c[r];
}
while (l < q[i].l)
{
ans -= (long long)num[c[l]] * num[c[l]] * c[l];
num[c[l]]--;
ans += (long long)num[c[l]] * num[c[l]] * c[l];
l++;
}
while (l > q[i].l)
{
l--;
ans -= (long long)num[c[l]] * num[c[l]] * c[l];
num[c[l]]++;
ans += (long long)num[c[l]] * num[c[l]] * c[l];
}
while (r > q[i].r)
{
ans -= (long long)num[c[r]] * num[c[r]] * c[r];
num[c[r]]--;
ans += (long long)num[c[r]] * num[c[r]] * c[r];
r--;
}
q[i].ans = ans;
}
sort(q, q + m, cmpid);
for (int i = 0; i < m; i++)
cout << q[i].ans << "\n";
return 0;
}

codeforces 86D D. Powerful array的更多相关文章

  1. CodeForces - 86D D. Powerful array —— 莫队算法

    题目链接:http://codeforces.com/problemset/problem/86/D D. Powerful array time limit per test 5 seconds m ...

  2. codeforces 86D D. Powerful array(莫队算法)

    题目链接: D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input stan ...

  3. codeforces 86D,Powerful array 莫队

    传送门:https://codeforces.com/contest/86/problem/D 题意: 给你n个数,m次询问,每次询问问你在区间l,r内每个数字出现的次数的平方于当前这个数的乘积的和 ...

  4. CodeForces 86 D Powerful array 莫队

    Powerful array 题意:求区间[l, r] 内的数的出现次数的平方 * 该数字. 题解:莫队离线操作, 然后加减位置的时候直接修改答案就好了. 这个题目中发现了一个很神奇的事情,本来数组开 ...

  5. CodeForces 86D Powerful array(莫队+优化)

    D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard i ...

  6. Codeforces 86D Powerful array (莫队算法)

    题目链接 Powerful array 给你n个数,m次询问,Ks为区间内s的数目,求区间[L,R]之间所有Ks*Ks*s的和. $1<=n,m<=200000,   1<=s< ...

  7. Codeforces 86D Powerful array (莫队)

    D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard i ...

  8. D. Powerful array 离线+莫队算法 给定n个数,m次查询;每次查询[l,r]的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt*cnt*x; 所有贡献和即为该区间的值;

    D. Powerful array time limit per test seconds memory limit per test megabytes input standard input o ...

  9. D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力

    莫队算法就是优化的暴力算法.莫队算法是要把询问先按左端点属于的块排序,再按右端点排序.只是预先知道了所有的询问.可以合理的组织计算每个询问的顺序以此来降低复杂度. D. Powerful array ...

随机推荐

  1. LeetCode226 翻转二叉树

    翻转一棵二叉树. 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 备注:这个问题是受到 Max Howell的 原问题  ...

  2. IDEA 常用的一些 (就几个) 快捷键

    快捷键 说明 Ctrl + P 提示类参数 Ctrl + Q 提示类的属性和方法包名 Ctrl + D 复制一行到下一行 Ctrl + F 查找 Ctrl + R 替换 Ctrl + Z 撤销 Ctr ...

  3. Sentinel上下文创建及执行

    Sentinel上下文创建及执行,入口示例代码: public static void fun() { Entry entry = null; try { entry = SphU.entry(SOU ...

  4. CodeMonke少儿编程第1章 step与turn

    第1章 step与turn 目标 了解游戏舞台的各组成部分 掌握step和turn指令的用法 说起计算机,对于不了解它的人来说,也许会感到有些神秘,其实不然,它不过是能够接收指令并且按照指令执行的一种 ...

  5. RocketMQ在linx安装及其有关问题解决

    Linx安装和使用: rocketmq官网:http://rocketmq.apache.org/ 首先安装JDK(推荐使用JDK1.8),并配置环境变量 下载rocketmq压碎包并解压到指定目录 ...

  6. RabbitMQ六种工作模式有哪些?怎样用SpringBoot整合RabbitMQ

    目录 一.RabbitMQ入门程序 二.Work queues 工作模式 三.Publish / Subscribe 发布/订阅模式 四.Routing 路由模式 五.Topics 六.Header ...

  7. ajax异步实现文件分片上传

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 标准PE头属性说明

  9. CobalStrike 4.0 生成后门几种方式 及 主机上线后基础操作

    出品|MS08067实验室(www.ms08067.com) 本文作者:BlackCat(Ms08067内网安全小组成员) CobalStrike 4.0 生成后门几种方式 步骤:Attacks-〉P ...

  10. secure hashes message digests 安全哈希 消息摘要

    hashlib --- 安全哈希与消息摘要 - Python 3.8.3 文档 https://docs.python.org/zh-cn/3.8/library/hashlib.html hashl ...