D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力
莫队算法就是优化的暴力算法。莫队算法是要把询问先按左端点属于的块排序,再按右端点排序。只是预先知道了所有的询问。可以合理的组织计算每个询问的顺序以此来降低复杂度。
典型的莫队算法题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long LL;
const int INF=0x4fffffff;
const int EXP=1e-;
const int MS=; int a[MS];
int cnt[*MS];
LL ans[MS]; struct node
{
int l,r;
int no,qid;
bool operator <(const node &a)const
{
return no<a.no||(no==a.no&&r<a.r);
}
}nodes[MS]; int n,SIZE;
LL res;
int L,R;
LL query(int x,int y,int flag)
{
if(flag)
{
for(int i=x;i<L;i++)
{
res+=(cnt[a[i]]<<|)*a[i];
cnt[a[i]]++;
}
for(int i=L;i<x;i++)
{
cnt[a[i]]--;
res-=(cnt[a[i]]<<|)*a[i];
}
for(int i=R+;i<=y;i++)
{
res+=(cnt[a[i]]<<|)*a[i];
cnt[a[i]]++;
}
for(int i=y+;i<=R;i++)
{
cnt[a[i]]--;
res-=(cnt[a[i]]<<|)*a[i];
}
}
else
{
for(int i=x;i<=y;i++)
{
res+=(cnt[a[i]]<<|)*a[i];
cnt[a[i]]++;
}
}
L=x;R=y;
return res;
} int main()
{
int Q;
scanf("%d%d",&n,&Q);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]); // 注意%d的速度远大于%I64d的速度
// 在大量数据输入时,能用%d就不要用%I64d,但千万要注意数据溢出
}
SIZE=sqrt(n+0.5);
for(int i=;i<Q;i++)
{
scanf("%d%d",&nodes[i].l,&nodes[i].r);
nodes[i].no=nodes[i].l/SIZE;
nodes[i].qid=i;
}
sort(nodes,nodes+Q);
memset(cnt,,sizeof(cnt));
res=;
for(int i=;i<Q;i++)
ans[nodes[i].qid]=query(nodes[i].l,nodes[i].r,i);
for(int i=;i<Q;i++)
printf("%I64d\n",ans[i]);
return ;
}
D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力的更多相关文章
- [Codeforces86D]Powerful array(莫队算法)
题意:定义K[x]为元素x在区间[l,r]内出现的次数,那么它的贡献为K[x]*K[x]*x 给定一个序列,以及一些区间询问,求每个区间的贡献 算是莫队算法膜版题,不带修改的 Code #includ ...
- Codeforces 86D - Powerful array(莫队算法)
题目链接:http://codeforces.com/problemset/problem/86/D 题目大意:给定一个数组,每次询问一个区间[l,r],设cnt[i]为数字i在该区间内的出现次数,求 ...
- codeforces 86D D. Powerful array(莫队算法)
题目链接: D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input stan ...
- CodeForces - 86D D. Powerful array —— 莫队算法
题目链接:http://codeforces.com/problemset/problem/86/D D. Powerful array time limit per test 5 seconds m ...
- codeforces 86D,Powerful array 莫队
传送门:https://codeforces.com/contest/86/problem/D 题意: 给你n个数,m次询问,每次询问问你在区间l,r内每个数字出现的次数的平方于当前这个数的乘积的和 ...
- Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队
题目链接:点击传送 D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input ...
- CodeForces 86 D Powerful array 莫队
Powerful array 题意:求区间[l, r] 内的数的出现次数的平方 * 该数字. 题解:莫队离线操作, 然后加减位置的时候直接修改答案就好了. 这个题目中发现了一个很神奇的事情,本来数组开 ...
- CodeForces - 86D Powerful array (莫队)
题意:查询的是区间内每个数出现次数的平方×该数值的和. 分析:虽然是道莫队裸体,但是姿势不对就会超时.答案可能爆int,所以要开long long 存答案.一开始的维护操作,我先在res里减掉了a[p ...
- CodeForces - 220B Little Elephant and Array (莫队+离散化 / 离线树状数组)
题意:N个数,M个查询,求[Li,Ri]区间内出现次数等于其数值大小的数的个数. 分析:用莫队处理离线问题是一种解决方案.但ai的范围可达到1e9,所以需要离散化预处理.每次区间向外扩的更新的过程中, ...
随机推荐
- 构建Spark作业
首先,要清楚,一个Java或Scala或python实现的Spark作业. 1.用sbt构建Spark作业 2.用Maven构建Spark作业 3.用non-maven-aware工具构建Spark作 ...
- MYSQL数据库性能调优之二:定位慢查询
windows下开启慢查询: 第一步:先查看版本 第二步查看查询日志和慢查询配置 第三步:配置开启慢查询 在my.ini配置文件的[mysqld]选项下增加: slow_query_log=TRUE ...
- 可迭代的集合类型使用foreach语句
在学习算法这本书图论那一部分的时候,接触到了几个类似for(int w:G.adj(v)),的语句,不是很理解,就去百度,发现这是一种叫做foreach的语法,在书的76页有讲到,但是之前没认真看书, ...
- lambda表达式和ef的语句转化
这两者转化可以用linqpad进行转化, 首先推荐一个网站可以了解一下orderby的排序方式 http://www.csharpwin.com/csharpspace/614.shtml 然后下面有 ...
- c++/java/c# 几种编程语言的指针、引用比较
前一段时间,我在 cnblogs 别人的博客中,谈到: java 中的引用/指针,与 c++/C# 中的引用/指针不是一个概念. Java 引用,相当于 c++ 指针(fun3).Java 引用可以赋 ...
- jQuery在updatepanel中使用造成内存泄露
wijmo用户反馈了一个RadialGauge控件内存泄露的bug,采用chrome监控内存使用情况,发现明显的内存泄露,在前面的文章中我就发现了jQuery内存泄露的问题,这次再次发现此问题,自然就 ...
- WIN7建立wifi热点及无法启动承载网络的解决办法
1,根据网络共享的方法,最简单莫过于利用Win7的虚拟网卡来做热点,而不用借助其他软件. 首先,用管理员身份打开CMD命令提示符,输入 netsh wlan set hostednet ...
- Kafka学习记录
1 Kafka的基本介绍 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.具有快速.可扩展.分布式.可复制等特点.Kafka与传 ...
- iOS7 各种问题解决
1 UITableView 行分割线不到头,短线问题 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { ...
- MFC中OnDraw()和OnPaint()的区别[转]
问题 问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同? OnDraw()和OnPaint()好象兄弟俩,因为它们的工作 ...