分块
DZYO
Never stop
展开
-
BJ模拟 等差数列(分块+FFT)
Description 给定N个整数 A1,A2,⋯AN ,求有多少个三元组 (i,j,k) 满足 1≤ijk≤N 且 Aj−Ai=Ak−Aj 。Input 第一行一个正整数 N(3≤N≤105) 第二行 N 个整数 A1,A2,⋯,AN , 1≤Ai≤3×104Output 输出一个整数表示答案。Sa原创 2017-03-21 11:47:17 · 611 阅读 · 0 评论 -
YY模拟:跳蚤(分块)
题意: 维护以下三个操作: 1. 在位置xxx 放置一只每次向右(坐标增大方向)跳ttt 格的跳蚤。 2. 命令所有跳蚤向右跳跃一次,跳跃的距离为各自的ttt。 3. 给定区间[l;r][l;r][l; r],求该区间内跳蚤的个数。 (Q≤1e5,1≤x,ti≤1e5,1≤li≤ri≤1e5Q≤1e5,1≤x,ti≤1e5,1≤li≤ri≤1e5Q \le 1e5, 1\le x,t_...原创 2018-04-16 16:48:20 · 427 阅读 · 0 评论 -
BJ模拟:Rectangle Query(bitset)
传送门题解: 用bitset+分块求点集交。 去重类似记pre,以横坐标为例,如果两个点横坐标相同且会同时被计算,那么我们保证只统计下面的点即可。为了保证这一点我们把这个点复制一份到新图的下面的点的位置上去,然后再求一次点集交即可统计有多少被算重。时间复杂度:O(nn−−√+nq64)O(nn+nq64)O(n \sqrt{n} + \frac{nq}{64})#include &...原创 2018-05-03 19:02:11 · 219 阅读 · 0 评论 -
整数划分问题的高效解法 (n logn)
一般此类问题可以看做是一个背包问题,不过有更优秀的解法。1.数字互不相同(51nod1201)(O(nn‾√)O(nn)O(n \sqrt {n}))注意到最多有O(n‾√)O(n)O(\sqrt{n})个数相加,则记fi,jfi,jf_{i,j}表示jjj个数和为iii的方案数。我们讨论一个方案的最小值是否为1,如果为1,则fi−1,j−1→fi,jfi−1,j−1→fi,jf_{i...原创 2018-05-04 20:14:53 · 2899 阅读 · 1 评论 -
HDU6271:Master of Connected Component(树分块+并查集)
传送门题解: O(n2logn)O(n2logn)O(n^2 \log n )就直接暴力并查集。不过注意到我们要算很多重复的部分。容易想到dfs到一个点,我们把距离他O(n−−√)O(n)O(\sqrt{n})的点的答案都做出来。 合理分配后这样的点最多n−−√n\sqrt{n}个。我们对这n−−√n\sqrt{n}个点都算一次即可。 时间复杂度O(nn−−√logn)O(nnlog...原创 2018-07-11 19:37:38 · 498 阅读 · 0 评论 -
Codechef:Sereja and Arcs/SEAARC
传送门题解:这种题显然对出现次数分类讨论一下。出现少的O(S2)O(S^2)O(S2)做,出现多的O(n)O(n)O(n)做,最后可以做到O(nnlogn)O(n \sqrt{n \log n})O(nnlogn)的复杂度。#include <bits/stdc++.h>using namespace std;typedef pair <int,int> p...原创 2018-10-11 21:36:00 · 318 阅读 · 0 评论 -
BZOJ5220: [Lydsy2017省队十连测]异或与区间加
传送门题解:首先前缀异或处理一下,变成一堆数中两个异或为kkk。显然这是一一对应的关系,如果一对数中两个都小于n\sqrt{n}n个,直接暴力O(nn)O(n\sqrt{n})O(nn)解决。 否则在序列上O(n)O(n)O(n)解决一对数。 时间复杂度O(nn)O(n\sqrt{n})O(nn)。#include <bits/stdc++.h>using namesp...原创 2018-09-22 17:45:39 · 571 阅读 · 0 评论 -
Codechef :Chef and Balanced Strings/CBAL(分块)
传送门题解:分块SB题。#include &lt;bits/stdc++.h&gt;using namespace std;typedef long long LL;const int RLEN=1&lt;&lt;18|1;inline char nc() { static char ibuf[RLEN],*ib,*ob; (ib==ob) &amp;&amp;原创 2018-10-09 15:50:20 · 364 阅读 · 0 评论 -
Codechef :Chef and Churu/FNCS(分块)
传送门题解:随便分一下块就好了。。#include &lt;bits/stdc++.h&gt;using namespace std;typedef unsigned long long LL;const int RLEN=1&lt;&lt;18|1;inline char nc() { static char ibuf[RLEN],*ib,*ob; (ib==ob) &amp...原创 2018-10-10 14:51:02 · 259 阅读 · 0 评论 -
NOI模拟:Binary(分块/Trie)
题意:给nnn个数a1~na1~na_{1 \text{~} n}, 对于i∈[2,n]i∈[2,n]i \in [2,n] , 求 max{ai^aj},max{ai&aj},max{ai|aj}max{ai^aj},max{ai&aj},max{ai|aj} max \{ a_i \text{^} a_j \} , \max \{ a_i \text{&}a_j\} , \...原创 2018-03-24 22:19:26 · 344 阅读 · 0 评论 -
BZOJ4537: [Hnoi2016]最小公倍数(分块)
传送门题解:好暴力的一道题啊。。容易发现如果把所有边看做二维平面上的点,那么我们要查询某个左下方的矩形的连通性以及最大值。这个用数据结构不好维护,用稍微暴力一点的分块来维护。按照横坐标aaa分为n‾√n\sqrt{n}块,询问放到对应块并按照bbb的顺序来对于前面的块做扫描线,每个块会被扫描m‾‾√m\sqrt{m}次。还要考虑本块的贡献,这个可以直接暴力扫一遍,因为只有m...原创 2018-02-28 12:27:21 · 250 阅读 · 0 评论 -
Codeforces #449 Div.1 E: Welcome home, Chtholly(分块+并查集)
传送门题意: 给一个序列,支持如下操作: 1.l,r,x a[l~r]所有大于x的数减去x 2.l,r,x 查询a[l~r]中x的个数。 n,l,r,x≤1e5n,l,r,x\le 1e5题解:好妙的一道题。。记一个块的最大值(不超过O(n)O(n))。并查集维护每个块中的所有权值。每次修改时判断当前修改的值的两倍是否大于当前块的最大值。若不大于,则暴力修改小的部分(小的部分+v)并打修改标原创 2017-12-19 11:09:11 · 340 阅读 · 0 评论 -
NOIP模拟:Subset(分块)
Description 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作:add s 在集合中加入数字 s 。del s 在集合中删除数字 s 。保证 s 存在。如果有多个 s,只删除一个即可。cnt s 查询满足 a&s=a 条件的 a 的个数。Input 第一行一个整数 Q 接下来 Q 行,每一行都是 3 个操作中的一个。Output 对于每个 cnt 操作输出答原创 2017-07-11 15:33:56 · 539 阅读 · 0 评论 -
BZOJ2724: [Violet 6]蒲公英(分块)
传送门题意给一个数列,求区间众数(若有多个则输出较小值)。题解考虑分块,对于块i维护cnt[i][val]表示从1到i块中val出现了几次,维护ans[i][j]表示从i到j的众数(之后会用)。 因为没有修改操作,所以预处理cnt,ans; 对于ans,固定左端点,右端点暴力枚举。时间复杂度O(nn√)O(n\sqrt{n})。 对于cnt,暴力枚举,每扫描完一个区间就枚举val更新区原创 2017-07-14 20:19:57 · 380 阅读 · 0 评论 -
BZOJ2821: 作诗(Poetize)(分块)
传送门题意给你一个区间,每次查询(l,r),问(l,r)中数字出现偶数次的种类数。题解分块大法好。。。 分析: 1.查询(l,r)中的数字出现偶数次的种类数,可以等价于完整块中数字种类数及不完整块中数字种类数(前半部分可以预处理,后半部分暴力)时间复杂度O(n√)O(\sqrt{n}) 2.对于不完整块种类数,要考虑与完整块中数字出现重复,这时我们需要求出完整块中某个数的个数,再来统计原创 2017-07-15 17:22:17 · 312 阅读 · 0 评论 -
BZOJ3343: 教主的魔法(分块)
传送门题意给你一个序列,每个序列有一个值。支持两种操作: 1.区间加减。 2.区间查询比C小的数的个数。题解有想法的人可以看出树套树可做。时间复杂度O(m⋅log2n)O(m·log^2\,n)。当然没想法的人可以直接写暴力,分块大法好。。时间复杂度O(m⋅n√⋅logn√)O(m·\sqrt{n}·log\,\sqrt{n})分块做可以说是道很简单的题了。先对每个块内部排序。对于查询,原创 2017-07-15 21:42:39 · 319 阅读 · 0 评论 -
BZOJ2453: 维护队列(分块)
传送门题意:给一个序列,每个位置对应一个值,支持下面两种操作: 1.修改某个位置的值。 2.询问(l,r)区间内不同值的个数。题解:1.考虑分块:统计ans[i][j]表示第i块到第j块的个数,容易发现对于每个询问,只需查看完整块的个数和不完整块的影响。时间复杂度O(n⋅n√)O(n·\sqrt{n})。但修改会修改两两块之间的ans[i][j],时间复杂度O(n⋅m)O(n·m)(这道原创 2017-07-16 15:57:56 · 607 阅读 · 0 评论 -
BZOJ2741: 【FOTILE模拟赛】L(分块+可持续化Trie)
传送门题意: 求区间的最大子区间异或和。(n≤12000)(n\le 12000)题解: 首先计算前缀和转化为子区间求两两异或最大值。 看到nn范围这么小,自然想到先分块搞搞了。。。 再套一颗可持续化Trie。。#include<bits/stdc++.h>using namespace std;struct IO{ streambuf *ib,*ob; inline v原创 2017-10-02 14:02:20 · 345 阅读 · 0 评论 -
BZOJ3236: [Ahoi2013]作业(权值分块+莫队)
传送门 听说一堆莫队+树状数组过的。。正解不应该是O(nn√)O(n\sqrt{n})? 莫队配合权值分块有奇效。。#include<bits/stdc++.h>using namespace std;inline int read(){ char ch=getchar();int i=0,f=1; while(!isdigit(ch)){if(ch=='-')f=-1;ch原创 2017-11-09 20:39:27 · 286 阅读 · 0 评论 -
BZOJ3585: mex(权值分块+莫队)
传送门既然看到了权值分块。。也就没什么好讲的了。#include<bits/stdc++.h>using namespace std;inline int read(){ char ch=getchar();int i=0,f=1; while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){原创 2017-11-09 21:36:27 · 371 阅读 · 0 评论 -
BJ模拟:string(后缀数组+Trie+ST表+分块)
给定一个长度为mm的01串AA,nn个长度为LiL_i的01串BiBi(总长为LL)。另有一个长度为nn的序列cic_i,表示BiB_i被选中1次的代价。要求将A划分成若干个串,并为每个划分出来的子串找一个BkiB_{k_i}(kik_i可以重复,重复代价算多次),满足此子串是BkiB_{k_i}的前缀或后缀。求最小总代价,如果不存在这样的划分,输出−1-1。为了造福群众,把数据放出来吧:http原创 2017-12-19 21:48:22 · 610 阅读 · 0 评论 -
hihoCoder 1236:Scores(bitset+分块)
传送门题意: 求多维偏序下比给定值小的个数。题解:不多说,这种毒瘤题直接bitset+分块吧。。#include<bits/stdc++.h>using namespace std;inline int rd(){ char ch=getchar();int i=0,f=1; while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}原创 2017-12-25 22:11:51 · 304 阅读 · 0 评论 -
Codechef :Children Trips/TRIPS(树分块)
传送门题解:设一个阀值kkk,小于kkk的倍增,大于kkk的暴力跳,这样的复杂度是O(nmk+nk)O(\frac{nm}{k}+nk)O(knm+nk)的,取k=mk=\sqrt{m}k=m最优,时间复杂度为O(nm)O(n \sqrt{m})O(nm)。不过空间开不下,要开小一点。同时有个结论:我们可以从两端跳到lca,最后拼起来,这样就大大降低代码复杂度了。#include &...原创 2018-10-10 18:58:10 · 414 阅读 · 0 评论