分块
文章平均质量分 64
bandiaoz_cjl
这个作者很懒,什么都没留下…
展开
-
Time to Raid Cowavans 分块,离线
Time to Raid Cowavans题意一个长度为 nnn 的数组 a ,给出 qqq 个询问,询问给出两个值 pos,xpos, xpos,x ,要求给出 $a_{pos} + a_{pos + x} +a_{pos + 2 \cdot x} + \dots $ 的值。题解B=nB = \sqrt nB=n ,如果 x≥Bx \ge Bx≥B ,那么直接暴力即可,复杂度 O(nx)<O(n)O(\frac{n}{x}) < O(\sqrt n)O(xn)<O(n)原创 2021-06-26 15:26:02 · 96 阅读 · 0 评论 -
数列分块入门 9 LibreOJ - 6285
数列分块入门9题意给了一个长度为 nnn 的序列,以及 nnn 个操作,询问区间众数,如果有多个出现次数相同,则取最小的。解法这题的数据量比蒲公英大,所以 O(nnlogn)O(n\sqrt n logn )O(nnlogn) 的算法就卡不过去了。但思路也是类似的。首先求出连续的大块 [idl,idr][idl,idr][idl,idr] 的众数作为候选答案,那么区间 [l,r][l,r][l,r] 的答案就是大块的答案或者所有小块的数字。然后为了求出小块的数字在大块中出现的次数,需要预处理原创 2020-09-09 13:27:45 · 360 阅读 · 1 评论 -
数列分块入门8 LibreOJ - 6284
数列分块入门8题意给出一个长度为 nnn 的序列,以及 nnn 个操作,每次操作询问区间 [l,r][l,r][l,r] 内等于 ccc 的元素的个数,并将这个区间内的所有元素改为 ccc 。解法这是一道分块入门的题目,那当然要用分块的做法,但是一开始一不小心写了 O(nnlogn)O(n\sqrt nlogn)O(nnlogn) 的算法,T飞之后一下子想不到怎么去掉 logloglog ,看到区间赋值之后尝试了一发珂朵莉树直接AC,挺开心的。然后这是一道分块入门的题目,那当然要用分块的做法。核原创 2020-09-08 20:04:02 · 166 阅读 · 0 评论 -
数列分块入门 7 LibreOJ - 6283
数列分块入门7题意给一个长度为 nnn 的序列,以及 nnn 个操作,涉及区间加法,区间乘法,单点查询。解法分块。小块暴力一定要先清空两个标记数组!某个点的真实值为 a[i]⋅mul[id]+base[id]a[i] \cdot mul[id]+base[id]a[i]⋅mul[id]+base[id] 。那么对于大块的加法操作,只要 base[id]=base[id]+xbase[id]=base[id]+xbase[id]=base[id]+x 即可对于大块的乘法操作,只要原创 2020-09-08 09:27:38 · 167 阅读 · 0 评论 -
数列分块入门 6 LibreOJ 6282
数列分块入门6题意给一个长度为 nnn 的序列,以及 nnn 个操作,操作涉及单点插入,单点询问,数据随机生成。解法分块。插入操作的复杂度为数组的长度 O(n)O(n)O(n) ,可以考虑把原来的数列分成 n\sqrt nn 块,那么插入的复杂度就是 O(n)O(\sqrt n)O(n) 了,为了避免每次都插入同一个块中,当块的大小太大,比如大于 2B2B2B 时,就重新分块,这样就可以保证 O(nn)O(n\sqrt n)O(nn) 的复杂度了。代码#pragma region#in原创 2020-08-24 16:04:22 · 107 阅读 · 0 评论 -
数列分块入门5 LibreOJ - 6281
数列分块入门5题意有 nnn 个数, nnn 次操作,每次操作为区间开方或者区间求和。解法分块。a[i]<232a[i]<2^{32}a[i]<232 ,而 232→216→28→24→22→21→12^{32}\to 2^{16}\to 2^{8}\to 2^{4}\to 2^{2}\to 2^{1}\to 1232→216→28→24→22→21→1 ,所以 a[i]a[i]a[i] 最多开方 666 次就变成 111 。所以可以用一个 cnt[id]cnt[id]cnt[i原创 2020-08-22 14:12:39 · 144 阅读 · 0 评论 -
数列分块入门4 LibreOJ - 6280
数列分块入门4题意有 nnn 个数, nnn 次操作,每次操作为区间加或者区间求和。解法分块。维护三个数组:a[i]a[i]a[i] 表示原数组,小块的时候直接暴力 xxx 加即可。base[id]base[id]base[id] 表示每一个大块的偏移量,即第 iii 个元素的真实值为 a[i]+base[id]a[i]+base[id]a[i]+base[id] 。res[id]res[id]res[id] 表示每一个块所有元素的和,修改小块的时候暴力加 xxx ,修改大块的时候加 x∗B原创 2020-08-22 13:41:39 · 183 阅读 · 1 评论 -
数列分块入门3 LibreOJ - 6279
数列分块入门3题意有 nnn 个数, nnn 次操作,每次操作为区间加或者询问区间内某个数的前驱(即比这个数小的最大元素)。解法分块。每一个块维护一个有序数列。区间加的小块暴力加即可,大块就加到一个 base[id]base[id]base[id] 数组中,复杂度为 O(n)O(\sqrt n)O(n)询问的时候小块只要暴力找满足 a[i]+base[id]<xa[i]+base[id]<xa[i]+base[id]<x 的值并维护 a[i]+base[id]a[i]+b原创 2020-08-22 13:28:40 · 220 阅读 · 0 评论 -
数列分块入门2 LibreOJ - 6278
数列分块入门2题意有 nnn 个数, nnn 次操作,每次操作为区间加或者询问区间内小于某个数的个数。解法分块。每一个块维护一个有序数列。区间加的小块暴力加即可,大块就加到一个 base[id]base[id]base[id] 数组中,复杂度为 O(n)O(\sqrt n)O(n)询问的时候小块只要暴力找 a[i]+base[id]<xa[i]+base[id]<xa[i]+base[id]<x 的个数即可,大块二分查找 x−base[id]x-base[id]x−bas原创 2020-08-22 13:15:25 · 108 阅读 · 0 评论 -
洛谷P4135 作诗 分块
作诗题意求区间内出现偶数次数的数的个数,强制在线。(数组大小 1⋅1051\cdot 10^51⋅105,询问 1⋅1051\cdot 10^51⋅105)解法分块。维护数组 s[id][x]s[id][x]s[id][x] 表示 xxx 在第 1…id1 \dots id1…id 块中出现的次数。维护方法:遍历数组 1−n1-n1−n ,当 i%B==0i \% B==0i%B==0 时,继承上一个块的信息。然后 s[i/B][a[i]]+1s[i/B][a[i]]+1s[i/B][a[i]原创 2020-08-21 20:59:23 · 74 阅读 · 0 评论 -
CF785E Anton and Permutation 分块,逆序对
CF785E Anton and Permutation题意动态逆序对,对长度为 nnn 的排列进行 qqq 次操作,每次交换序列中两个数,并输出当前序列的逆序对数。解法初始答案为 000 ,我们只需要计算每次交换操作对逆序对的改变即可。不妨设 l≤rl \le rl≤r ,显然当 l=rl=rl=r 时逆序对不变。当 l<rl<rl<r 时,设 x=a[l],y=a[r]x=a[l],y=a[r]x=a[l],y=a[r] ,逆序对的变化 === cnt⋅2+1cnt \cd原创 2020-08-21 20:58:07 · 159 阅读 · 0 评论 -
AcWing249 蒲公英 分块
蒲公英(区间众数)题意区间众数,不带修改,强制在线(否则可以莫队)。如果两个数出现次数一样多,输出较小的数。解法分块。首先,一段区间的众数的候选答案一定是大块的众数或者小块的每一个数,先预处理出大块的众数,这样候选答案的范围就缩小到了 n\sqrt nn 个,然后每个再询问区间内出现的次数,维护答案即可。预处理大块的众数暴力就可以了,左端点是每一个大块的左端点,然后向右扫过去就可以了。由于左端点只有 n\sqrt nn 个,所以这部分的时间复杂度为 O(nn)O(n \sqrt n)O(nn原创 2020-08-21 20:43:40 · 158 阅读 · 0 评论