分块
文章平均质量分 55
CarryNotKarry
AFOer/ACMer
展开
-
『莫队算法』 - 求区间内个数为k有多少个/不同种个数 - P1972 [SDOI2009]HH的项链 SP3267 DQUERY - D-query(数据较弱)
莫队算法 莫队,莫涛,长郡中学学生,算我半个学长了,后进入清华大学学习,IOI中国国家队队长发明了“莫队算法”,在国外名字叫做"Mo's Algorithm"。莫队算法的精髓就是通过合理地对询问排序,然后以较优的顺序暴力回答每个询问。处理完一个询问后,可以使用它的信息得到下一个询问区间的答案。 我们设置一个结构体,存储我们需要的变量,有l,r,id,可能还有其他的。struct Mo{int l,r,ID,k;int ans;}q[N...原创 2021-07-14 10:25:57 · 573 阅读 · 0 评论 -
分块入门总结
前言 这一切都是基于「分块」数列分块入门1 – 9,也就是对其的总结。链接#6277. 数列分块入门 1#6278. 数列分块入门 2 - 题目 - LibreOJ (loj.ac)#6279. 数列分块入门 3 - 题目 - LibreOJ (loj.ac)#6280. 数列分块入门 4 - 题目 - LibreOJ (loj.ac)#6281. 数列分块入门 5 - 题目 - Li...原创 2021-07-09 10:32:31 · 408 阅读 · 0 评论 -
数列分块入门9 LibreOj 6285
题意给出一个长为的数列,以及个操作,操作涉及询问区间的最小众数。思路 我们需要统计数字x出现了多少次,我们用一个统计数组来使得a[x]++,但是这里面数字太大,我们首先需要用到离散化处理,反正最多才1e5的数字。我们读入一个数a[i],如果a[i]没有出现过,那么就用map存下他的位置,然后再用val数组存这个位置存的值;如果出现过,那么a[i]就存map里面的值,也就是存下它第一次出现的位置,最后将其塞入vector里面。这样a[i]存的就是[1,1,1,2,...原创 2021-07-09 10:10:53 · 320 阅读 · 0 评论 -
数列分块入门8 LibreOj 6284
题意给出一个长为的数列,以及个操作,操作涉及区间询问等于一个数的元素,并将这个区间的所有元素改为。思路 我们这里用flag标志数组,其作用类似于之前的lazy数组,如果,那么代表这一块还没有被整体赋值,如果,那么代表这一块是整体赋值了的,如果flag[i]==c,那么代表这一块都是c,那么ans+=block(块的长度);如果flag[i]!=c,那么就更新为c,ans不变化。 对于不完整块,我们首先看flag是否更改过,如果更改过,那我们首先先r...原创 2021-07-09 09:47:16 · 269 阅读 · 0 评论 -
数列分块入门7 LibreOj 6283
题意给出一个长为的数列,以及个操作,操作涉及区间乘法,区间加法,单点询问。思路 这个问题一开始把我搞蒙了,因为乘法加法是由优先级的,并不是两个数组一直堆,一个一直加一个一直乘,最后查询在统一计算,比如,让我们来列一个表格来看看具体怎么操作。 但是我们还是需要设置两个数组,一个是mul,一个是sum,mul是来存乘的,sum是用来存加的。表达式 ...原创 2021-07-08 15:49:13 · 254 阅读 · 0 评论 -
数列分块入门6 LibreOj 6282
题意给出个数的数列,有个操作,操作涉及到单点插入和单点查询思路 这里应该就不能用数组模拟每一块了,因为我们要是插入一个值,得将后面的值全部往后移,如果我们用vector的话,我们只需要用insert函数,将vector[i]这一块的里面该值后面的往后移,这样时间复杂度最大超过。 考虑到极端情况,如果疯狂往一个块里面插入数字,那么最后时间复杂度跟全部移没有什么太大差别了,那么我们就重新分块,对,重新分块,我们设置一下条件,如果当前块的长度大于,我们就...原创 2021-07-08 11:41:51 · 196 阅读 · 0 评论 -
数列分块入门1 LibreOj 6277
题目描述给出一个长为的数列,以及个操作,操作涉及区间加法,单点查值。输入格式第一行输入一个数字。第二行输入个数字,第i个数字为,以空格隔开。接下来输入行询问,每行输入四个数字、、、,以空格隔开。若 =1,表示将位于 的之间的数字都加 。若 =0,表示询问的值(和忽略)。输出格式对于每次询问,输出一行一个数字表示答案。样例Input Output 41 2 2 30 1 3 11 0 1 00 1 2 21 0 2 0 ...原创 2021-07-05 19:51:32 · 200 阅读 · 0 评论 -
数列分块入门2 LibreOj 6278
题意 给出个数,有次操作,每次操作可以是将区间加上某个数,或者查找区间内小于某个数有多少个思路 有了数列分块入门1的思路之后,我们继续将区间内加上某个数用标记,我们用a存数组,多设置一个b数组来“复制”a数组,并对每块进行sort排序(时间复杂度是),一共有块,所以时间复杂度是。 对于b数组,我们每一次修改a数组之后就进行复制,注意:是对整块的复制,因为b数组是有序的,对于完整的块我们只需要用来记录,不需要整个加法,最后查询的时候我们可以转化为查询比...原创 2021-07-06 00:47:42 · 266 阅读 · 0 评论 -
数列分块入门3 LibreOj 6279
题意 给出个数的数列,有个操作,操作涉及到区间加法和求区间前驱(小于的最大值)思路 区间加法还是跟前几题一样用数组标记,同入门2求小于的个数,那么我们还是将每一块进行排序,然后用二分的方法去查找,这样的时间复杂度并不高。代码...原创 2021-07-08 10:39:07 · 333 阅读 · 0 评论 -
数列分块入门5 LibreOj 6281
题意 给出个数的数列,有个操作,操作涉及到区间开方和区间求和思路 不要被区间开放搞懵了,题目给了最大的是,那么就来看看最多多少次能够开方到1,,实际上最多六次即可,那么我们设置一个数组来判断是否都为1了,如果都为1了,那么我们就在对于中间完整块求和的时候,我们直接加上block(区间长度)即可。 那么要是不为1呢,我们继续用数组来求区间和,在的时候即可初始化,对于每一次暴力开方的时候,我们首先先用区间和()减去,然后进行开方,然后我们用加上这样我...原创 2021-07-08 11:15:32 · 198 阅读 · 0 评论 -
数列分块入门4 LibreOj 6280
题意给出个数的数列,有个操作,操作涉及到区间加法和区间求和,对(+1)进行取模思路 区间加法依旧是用数组,区间求和我首先想到的是前缀和,对于每一块我们用前缀和,但是我们对于不完整块都是用暴力解决的,所以我还是放弃了前缀和的方法,设置了一个数组来统计块的和,如果对于完整的块我们直接加上和(block是块的长度),这样的话就可以完成区间求和的操作,好吧,这是线段树可以轻而易举的做到,但这里写的是分块。代码#include<stack>#inclu...原创 2021-07-08 10:53:16 · 240 阅读 · 0 评论