分块
穷源溯流
路很长,尽管走便是。
展开
-
洛谷 P4396 [AHOI2013]作业(莫队+值域分块)
抱歉,一开始读错题了由于最后统计 [a,b] 中有多少数出现过,以及位于 [a,b] 内的数值个数由于这两个是相关联的,所以不好一起统计,所以采用暴力的方法,但是暴力一定超时,所以在这里使用分块写分块的时候到底需要几个参数,首先对于非整块,vis[x] x出现的次数;对于整块 tag[x] x出现的次数,cnt[x] x 出现的种数const int N=1e5+5; int n,m; int i,j,k; int a[N]; struct Que...原创 2021-01-24 21:37:30 · 247 阅读 · 0 评论 -
洛谷 P4137 Rmq Problem / mex(莫队+值域分块)
看到这个题目后,删除 O(1) 添加 O(n),做法就是遍历区间 [now,n] 但是最后一个点会T看到有人说值域分块可以过,虽然最后一个点过了,但是前面又过不了了,最后还是要开 O2void add(int pos) //暴力添加代码{ int x=a[pos]; if(!vis[x] && now==x){ for(int i=x+1;i<=n+1;i++){ if(!vis[i]){ now=i; b...原创 2021-01-24 18:23:39 · 263 阅读 · 0 评论 -
训练总结
树上莫队应该是看明白了,但带修改的莫队好像又忘了,还有回滚莫队到底是什么(雾)树上莫队采用的是欧拉序将树形结构转化为线性结构,对于刚刚回顾完树剖的我来说还是比较容易理解的,但是能记多久就不清楚了虽然之前做过主席树的模板题,但现在重新学习就和新的一样,网上的图倒是一目了然,想了一下午竟然才知道每个节点的左右儿子并不是维护区间昨天开了一场 CF ,题感觉考的比较偏,最近几次做题,分不清楚什么时候应该贪心,什么时候应该使用动态规划,盲目的猜结论,WA了之后才想要造个数据推翻,沉不住气。这周一道关于原创 2021-01-23 22:04:18 · 104 阅读 · 0 评论 -
洛谷 P3730 曼哈顿交易(莫队+值域分块)
题目应该算是莫队里面比较难的(蒟蒻的我自我安慰)求区间第 k 小数不由得想到主席树,但这是类似于众数的形式,所以还是考虑莫队但是莫队之前做过一道求众数的大小的题目,是否可以向这方面靠拢,一定要有一个数组记录 x 出现的次数,记为 a 数组。再添加一个出现过 x 次的数有多少次的数组,记为数组 b。以上两个数组是最基本的,我们要求区间内第 k 小的出现次数,暴力的话就是顺序遍历 b 数组数到 k,但是时间复杂度为 但是如果我们用分块处理一下 a 数组,这样复杂度不就变成,总体还是...原创 2021-01-23 10:14:08 · 267 阅读 · 0 评论 -
LOJ #6282. 数列分块入门 6
这种题也可以用分块!用 vector 维护每个整块内的元素,利用内置 insert 函数可以很方便的插入,但不要忘记 vector 是从下标 0 处开始计数当 vector内的元素个数大于一定程度时,需要重新分块,因为 vector 插入的复杂度较高const int N=1e5+5; int i,j,k; int n,m,t; int a[N<<1],block,num; //不断插入元素,数组开大一点 vector<in...原创 2020-11-15 21:48:28 · 351 阅读 · 0 评论 -
LOJ #6284. 数列分块入门 8
设置一个数组维护一个块内所有的数是否相等,若全部等于 x,则将数组标记为 x,这样在处理整块的数组时,只有 tag[]=-1 时需要操作,对于不是整块的暴力即可const int N=1e5+5; int i,j,k; int n,m,t; int a[N]; int bel[N],num,block; int L[N],R[N],tag[N];void build(){ block=sqrt(n); num=n/bloc...原创 2020-11-15 10:00:29 · 387 阅读 · 0 评论 -
LOJ #6283. 数列分块入门 7
标记下传代码:const ll mod=10007;const int N=1e5+5; int i,j,k; int n,m,t; int a[N]; int bel[N],block,num,L[N],R[N]; int sum[N],tag[N]; //sum 表示块+,tag 表示块*void build(){ block=sqrt(n); num=n/block; if(n%block) num++; ...原创 2020-11-12 18:25:59 · 268 阅读 · 0 评论 -
LOJ #6281. 数列分块入门 5
对于一个区间内开平方的复杂度是相当大的,但是只有当一个区间内有一个数 >=2 时才有资格开平方,所以添加一个数组来维护整个块是否需要开平方const int N=5e4+5; int i,j,k; int n,m,t; int a[N]; int L[N],R[N]; int bel[N],block,num,sum[N],all[N];void build(){ block=sqrt(n); num=n/bloc...原创 2020-11-12 09:00:11 · 312 阅读 · 0 评论 -
LOJ #6280. 数列分块入门 4
利用分块,对于整块的再加一个区间和的数组来维护然后一直 WA,看了看讨论的,要开 long long …… 可能是做法太暴力了吧const int N=5e4+5; int i,j,k; int n,m,t; int a[N]; int L[N],R[N]; ll bel[N],block,num,sum[N],all[N];void build(){ block=sqrt(n); num=n/block; if(n...原创 2020-11-12 08:23:08 · 222 阅读 · 0 评论 -
LOJ #6279. 数列分块入门 3
根据分块的思想,对于不整块的我们直接暴力统计,但是对于整块的,我们可以对每一块进行一个排序,利用二分查找找出最大的小于 c的数,然后重复此操作即可const int N=1e5+5; int i,j,k; int n,m,t; int a[N]; int L[N],R[N],bel[N],block,num; int tag[N],b[N];void build(){ block=sqrt(n); num=n/bloc...原创 2020-11-11 21:33:40 · 265 阅读 · 0 评论 -
LOJ #6278. 数列分块入门 2
根据分块的思想,对于不整块的我们直接暴力统计,但是对于整块的,我们可以对每一块进行一个排序,利用二分查找找出最小的大于 c*c 的位置,然后减去即可//#pragma GCC optimize(2)//#include <bits/stdc++.h>#include <iostream>#include <cmath>#include <cstdio>#include <algorithm>#include <...原创 2020-11-10 23:01:28 · 431 阅读 · 0 评论 -
LOJ #6277. 数列分块入门 1
#include <bits/stdc++.h>#define null NULLusing namespace std;const int N=5e4+5; int n,m,k; int a[N]; int l[N],r[N],belong[N]; void build(){ int block=sqrt(n); if(n%block) block++; }int main(){ cin>>n; f.原创 2020-11-10 17:53:46 · 191 阅读 · 0 评论