分块
huanghongxun
这个作者很懒,什么都没留下…
展开
-
BZOJ 2141 排队 分块
分块大法好,大力出奇迹! 先离散个化。lower_bound最近很少用了。。 既然静态可以用树状数组,那么我们分块,对每个块开个树状数组,保存块内的元素。 对于每个查询(x,y),可以确定内部包含的块,然后直接查询块的树状数组即可,x往右和y往左的一小段没有被包在块中的由于总数不超过O(sqrt(n)),所以暴力就好啦。 对于每个询问,O(sqrt(n)logn)。 #include原创 2016-01-05 13:52:49 · 580 阅读 · 0 评论 -
BZOJ 2038 小Z的袜子 莫队算法介绍
莫队算法好神奇。。 假设有M个询问,可能实现是这样的:queries.each { (l, r) => process-answer (l, r) }其中process-answer (l,r)应该是O(n)O(n)或多个log的查询。 变换一下形式:init = () queries.each { (l, r) => transform-range init -> (l, r)原创 2016-03-13 00:15:52 · 370 阅读 · 0 评论 -
CodeForces 86D Powerful array 莫队算法
对于每个询问统计区间内每种数字出现次数的平方乘以数字本身的和。 莫队裸题。#include <cmath> #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; const int N = 200005; int block[N], c[N], s[1000001]; ll x[N]; s原创 2016-03-13 10:07:18 · 566 阅读 · 0 评论 -
BZOJ 3289 Mato的文件管理 莫队算法
询问区间内逆序对的个数。 区间转移是O(logn)O(\log n)的,加上莫队总复杂度(O(nn‾√logn)(O(n\sqrt{n}\log n)。#include <cmath> #include <cstdio> #include <algorithm> using namespace std; const int N = 50005; int block[N], a[N], c[N],原创 2016-03-13 13:31:30 · 360 阅读 · 0 评论 -
BZOJ 3339/3585 Rmq Problem/mex 莫队算法
连线段树都不愿意打了。。明明线段树要短 至于区间转移 如果是新增一个数字,和当前维护的mex值比较,如果相等,即已经把最小缺失的数字补上了,因此暴力查找下一个数字。其实想想写个树状数组应该也可?带两个log伤不起。。 如果删除一个数字,而且比当前维护的mex值小,更新答案。#include <cmath> #include <cstdio> #include <algorithm> using原创 2016-03-13 15:29:00 · 562 阅读 · 0 评论 -
SPOJ 10707 Count on a Tree II 树上莫队
查询树点对间不同数字的个数。为什么我的程序越改越慢。。。#include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define FOR(i,j,k) for(i=j;i<=k;++i) const int N = 40005, M = 100005, K = 16;int block[M]; struc原创 2016-03-14 21:22:46 · 784 阅读 · 0 评论 -
机房水题欢乐赛 2016-04-22 下午
水炸了。。。T1: Word给出一个原串和n个字符串。 判断原串是否存在两个不相交子串按顺序连接起来在n个字符串中存在一样的。 输出一样的个数。【输入样例】ABCBABA 2 BAAB ABBA【输出样例】1【样例解释】BAAB这个单词是无法出现在句子中的。 ABBA这个单词则可以出现在句子中,当a=1,b=2,c=4,d=5或者a=1,b=2,c=6,d=7时即可。【数据约定】40%数原创 2016-04-23 12:17:00 · 507 阅读 · 0 评论