Codeforces 86D Powerful array (莫队算法)
题目链接 Powerful array
给你n个数,m次询问,Ks为区间内s的数目,求区间[L,R]之间所有Ks*Ks*s的和。
$1<=n,m<=200000, 1<=s<=10^{6}$
考虑莫队算法
把区间排序,然后让l和r分别询问即可。
根据排序的方式,l指针和r指针移动次数和大概是$n\sqrt{n}$ 级别的。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 2e5 + 10;
const int M = 1e6 + 10; int belong[N]; struct query{
int l, r;
int id;
void scan(){ scanf("%d%d", &l, &r); }
friend bool operator < (const query &a, const query &b){
return belong[a.l] == belong[b.l] ? a.r < b.r :
belong[a.l] < belong[b.l];
}
} q[N]; int n, m;
int a[N], c[M];
int BS, l, r;
LL ret[N], ans; int main(){ scanf("%d%d", &n, &m);
rep(i, 1, n) scanf("%d", a + i); BS = sqrt(n);
rep(i, 1, n) belong[i] = (i - 1) / BS + 1;
rep(i, 1, m){
q[i].scan();
q[i].id = i;
} sort(q + 1, q + m + 1);
l = 0; r = 0; ans = 0; rep(i, 1, m){
while (l > q[i].l){
--l;
ans += (LL)(2 * c[a[l]] + 1) * a[l];
++c[a[l]];
} while (r < q[i].r){
++r;
ans += (LL)(2 * c[a[r]] + 1) * a[r];
++c[a[r]];
} while (l < q[i].l){
--c[a[l]];
ans -= (LL)(2 * c[a[l]] + 1) * a[l];
++l;
} while (r > q[i].r){
--c[a[r]];
ans -= (LL)(2 * c[a[r]] + 1) * a[r];
--r;
} ret[q[i].id] = ans;
} rep(i, 1, m) printf("%lld\n", ret[i]);
return 0;
}
Codeforces 86D Powerful array (莫队算法)的更多相关文章
- Codeforces 86D - Powerful array(莫队算法)
题目链接:http://codeforces.com/problemset/problem/86/D 题目大意:给定一个数组,每次询问一个区间[l,r],设cnt[i]为数字i在该区间内的出现次数,求 ...
- CodeForces - 86D Powerful array (莫队)
题意:查询的是区间内每个数出现次数的平方×该数值的和. 分析:虽然是道莫队裸体,但是姿势不对就会超时.答案可能爆int,所以要开long long 存答案.一开始的维护操作,我先在res里减掉了a[p ...
- D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力
莫队算法就是优化的暴力算法.莫队算法是要把询问先按左端点属于的块排序,再按右端点排序.只是预先知道了所有的询问.可以合理的组织计算每个询问的顺序以此来降低复杂度. D. Powerful array ...
- [Codeforces86D]Powerful array(莫队算法)
题意:定义K[x]为元素x在区间[l,r]内出现的次数,那么它的贡献为K[x]*K[x]*x 给定一个序列,以及一些区间询问,求每个区间的贡献 算是莫队算法膜版题,不带修改的 Code #includ ...
- CodeForces - 86D D. Powerful array —— 莫队算法
题目链接:http://codeforces.com/problemset/problem/86/D D. Powerful array time limit per test 5 seconds m ...
- codeforces 86D D. Powerful array(莫队算法)
题目链接: D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input stan ...
- Codeforces 86D Powerful array (莫队)
D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard i ...
- codeforces 86D,Powerful array 莫队
传送门:https://codeforces.com/contest/86/problem/D 题意: 给你n个数,m次询问,每次询问问你在区间l,r内每个数字出现的次数的平方于当前这个数的乘积的和 ...
- codeforces 86D : Powerful array
Description An array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary su ...
随机推荐
- Java IO file文件的写入和读取及下载
一.FileWriter 和BufferedWriter 结合写入文件 FileWriter是字符流写入字符到文件.默认情况下,它会使用新的内容代替文件原有的所有内容,但是,当指定一个true值作为F ...
- 【C语言项目】贪吃蛇游戏(下)
目录 00. 目录 07. 游戏逻辑 7.5 按下ESC键结束游戏 7.6 判断是否撞到墙 7.7 判断是否咬到自己 08. 游戏失败界面设计 8.1 游戏失败界面边框设计 8.2 撞墙失败界面 8. ...
- Ukulele 原来你也在这里
- WinPcap过滤串表达式的语法
注意:这篇文档取自tcpdump的指南.原始的版本 www.tcpdump.org 找到. wpcap的过滤器是以已声明的谓词语法为基础的.过滤器是一个ASCII字符串,它包含了一个过滤表达式.p ...
- (转发)IOS高级开发~Runtime(一)
IOS高级开发-Runtime(一) IOS高级开发-Runtime(二) IOS高级开发-Runtime(三) IOS高级开发-Runtime(四) 一些公用类: @interface Custom ...
- ios之键盘的自定义
一.键盘通知 当文本View(如UITextField,UITextView,UIWebView内的输入框)进入编辑模式成为first responder时,系统会自动显示键盘.成为firstresp ...
- Safari不能保存session的处理方法
在vue单页应用项目中,safari浏览器验证码登陆提示'验证码过期'或者验证码校验不通过的问题 原因:验证码存储在了session里,接着验证时又发起了一次会话,因为Safari不保存cookie, ...
- Python的第二堂课(1)
一.编程语言的分类 机器语言:直接使用二进制命令去编写程序. 优点:执行效率高 缺点:开发效率低 汇编语言:用英文标签代替二进制命令去编写程序 优点:开发效率高于机器语言 缺点:执行效率低于机器语言 ...
- 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x ...
- PHP “引号兄弟”
PHP的string最大可以达到2GB,不过很少会用到这么大的字符串. 单引号: 定义一个字符串最简单的方式是使用单引号,而在单引号字符串中要想表达一个单引号,需要在她的前面加个反斜线(\)来进行转义 ...