D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力
2015-04-03 20:58
417 查看
莫队算法就是优化的暴力算法。莫队算法是要把询问先按左端点属于的块排序,再按右端点排序。只是预先知道了所有的询问。可以合理的组织计算每个询问的顺序以此来降低复杂度。
D. Powerful array
典型的莫队算法题
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-5; const int MS=200005; int a[MS]; int cnt[5*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]]<<1|1)*a[i]; cnt[a[i]]++; } for(int i=L;i<x;i++) { cnt[a[i]]--; res-=(cnt[a[i]]<<1|1)*a[i]; } for(int i=R+1;i<=y;i++) { res+=(cnt[a[i]]<<1|1)*a[i]; cnt[a[i]]++; } for(int i=y+1;i<=R;i++) { cnt[a[i]]--; res-=(cnt[a[i]]<<1|1)*a[i]; } } else { for(int i=x;i<=y;i++) { res+=(cnt[a[i]]<<1|1)*a[i]; cnt[a[i]]++; } } L=x;R=y; return res; } int main() { int Q; scanf("%d%d",&n,&Q); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); // 注意%d的速度远大于%I64d的速度 // 在大量数据输入时,能用%d就不要用%I64d,但千万要注意数据溢出 } SIZE=sqrt(n+0.5); for(int i=0;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,0,sizeof(cnt)); res=0; for(int i=0;i<Q;i++) ans[nodes[i].qid]=query(nodes[i].l,nodes[i].r,i); for(int i=0;i<Q;i++) printf("%I64d\n",ans[i]); return 0; }
相关文章推荐
- 算法初步--求最大子数组和【暴力|优化枚举|贪心 】求解
- 生成不重复的随机数数组,算法优化
- 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心, 因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
- 【算法】_011_最大子数组_暴力法
- Big String 块状数组(或者说平方分割)
- 【BZOJ2754】【SCOI2012】喵星球上的点名 后缀数组优化暴力
- 【一个男人娶了四个妻子。临终时却。。。【这个故事有点深度。其实人人都是这样。。但现实中我们往往忽略真正意义上的东西】
- 基本的排序算法之——选择排序法(对于固定的空间数组或者顺序表)
- 【代码优化】返回0长度数组或者集合
- 大部分 android 或者 ios 客户端 的网络通讯其实都是在 模仿 网页浏览器
- 算法导论4.1-3~4.1-5最大子数组暴力算法和递归算法的实现和线性时间算法实现
- 数据结构与算法之:块状链表(或者叫块状数组)
- 整型数组处理算法(十一)请实现一个函数:线段重叠(性能优化)。[风林火山]
- strStr算法(无KMP) 略微优化的暴力解法
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- 2014 网选 5007 Post Robot(暴力或者AC_自动机(有点小题大作了))
- 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。 该校验的过程:1、从卡号最后一位数字开始,逆
- 将一个数组排序(数组的左一半和右一半都是小到大或者大到小)
- mongodb对数组增长的优化(使用占位空间,或者placeholder)
- 【算法】最大连续子数组 (暴力法、分治法、分析法、动态规划法)