有关分块入门的总结
hzwer大佬(黄学长)弄的一些有关分块运用的一些题目的总结,表示打的很艰辛啊~~(附代码)
Larry1118
这个作者很懒,什么都没留下…
展开
-
数列分块入门 1 总结
Question:这题分块~~(标题好像说的很明确的说)~~我们设一个block[]表示第i位属于哪个块。我们便可以这样子打: st=sqrt(n); for (int i=1;i<=n;i++) bl[i]=(i-1)/st+1;然后,对于opt==0我们发现它除了整个块,但两边可能会有一点点的多出来(就是不够一整个块)这两边我们可以暴力搞,而中间的,我们便存一个b[]...原创 2019-01-24 21:13:27 · 136 阅读 · 0 评论 -
数列分块入门 2 总结
这题,呜呜呜。。。。我™改了™的好几天啊啊啊啊啊!!!!!这题依旧分块。原序列设为a[]对于每个块,我们可以用另一个数组排序(在此设为d[])。另一个!!!(我不知道为什么,将原序列记录了位置在排序™还是错了。。。)然后,还是分类讨论。opt==0分成三块。1:l所在的凸出来的那一部分,暴力搞,然后将a[]中l的块暴力赋给d[],并排序。2:r所在的凸出来的那一部分,方法同上...原创 2019-01-25 21:47:29 · 201 阅读 · 0 评论 -
数列分块入门 3 总结
和入门 2很像。。。就是求答案有点点区别而已。。。左右凸出来的依旧暴力,而中间的依旧二分,然后将这些小于c的值取min即可。上标:#include<cstdio>#include<algorithm>#include<cmath>using namespace std;int a[100010],d[100010],n,b[321];int ...原创 2019-01-25 22:03:39 · 207 阅读 · 0 评论 -
数列分块入门 4 总结
这题变得容易了。。。只要记录一下每个块的总和即可。左右两边凸出来的暴力搞就可以了。上标:(感觉别人有毒吧,我跑1000ms+,他/她™只跑100ms+。。。 )#include<cstdio>#include<algorithm>#include<cmath>#define ll long longusing namespace std;i...原创 2019-01-26 07:25:02 · 163 阅读 · 0 评论 -
数列分块入门 5 总结
这题我得着重给一给数据范围,嗯嗯数据范围!!!哈哈,我们发现a[i]最大是231-1。好,我们开开方先:214748364746340(取整的)21514311…我们再试几个数,发现最终会变成0或1,然后就不会在变了。所以,它最多会开方5次,然后便相当于不变了。这样子,我们一开始全部暴力改。每当一个块的全部a[]都变成了0或1的话,就标记一下,表示下次不用再搞了。...原创 2019-01-26 21:25:17 · 413 阅读 · 0 评论 -
数列分块入门 6 总结
Question这题新加了一个插入操作,然后就是询问了,还好没有修改。。。网上的大都是什么vector的,都是STL。。。(但是身为蒟蒻的我还不会STL(┭┮﹏┭┮))所以我就将这输入用指针来存,然后插入就找到l的位置,然后指针插入。反正都是随机数据嘛~(应该不会遇到特殊情况)就这样我卡过了。。。上标:#include<cstdio>#include<cmath...原创 2019-02-19 18:38:56 · 228 阅读 · 0 评论 -
数列分块入门 7 总结
这题只要做对了前面的东东,这题肯定能做对的。(* ̄︶ ̄)只要设m[i]表示第i块整体要乘的数,p[i]表示第i块整体要加的数即可。记得!在乘c的时候要把p也给乘了(自己想想为什么)还有,在做左右两边凸出来的东西的话,要先把整块的m[bl[i]],p[bl[i]]都附上去,然后清空(m[bl[i]]=1,p[bl[i]]=0),否则会有意想不到的错误!!!上标:#include<c...原创 2019-01-28 21:10:54 · 239 阅读 · 0 评论 -
数列分块入门 8 总结
这题我们只需设个check[i]表示第i块是否都为一个数,b[i]表示第i块变成的数。然后暴力搞就可以了。至于为什么,我们看看hzwer大佬(黄学长)的解释吧:上标:#include&lt;cstdio&gt;#include&lt;algorithm&gt;#include&lt;cmath&gt;#define N 100010using namespace std;原创 2019-01-28 22:14:18 · 338 阅读 · 0 评论