
分块
Exception2017
OI总结
展开
-
数列分块入门1(区间加法)
原题:http://www.caioj.cn/problem.php?id=1244题解:对于区间的所有元素加c并要求单点的值。显然可以用线段树来求,但本篇要用新的方法来求。令:m为每一个块的大小,且m为根号n向下取整。每个块大小为m,共有n/m个块由于每次不完整的块大小较少,即每次操作时间复杂度为。又因根据均值不等式当时时间复杂度最少。所以每个块的大小为:。规定:m=sqrt(...原创 2018-12-23 22:36:12 · 147 阅读 · 0 评论 -
CF407E k-d-sequence 数列分块或线段树+单调栈
原题:http://codeforces.com/contest/407/problem/E题解:求添加k个元素后最长的等d差序列的左右端点,首先答案应该是连续的%d余数相同的一段(注意会有负数),而且这一段不可能有相同的数。对于这样的一段,将它除d化成公差为1的数列,在max{a[l-r]}-min{a[l-r]}-r<=k-l 时是等差数列。对于这样的问题考虑倒序枚举左端点,令mm[...原创 2019-03-01 23:44:48 · 297 阅读 · 0 评论 -
CF163E. e-Government AC自动机+fail树+分块
原题:http://codeforces.com/contest/163/problem/E题解:给k个字符串,维护3种操作,添加一个字符串,删除一个字符串,查询模式串在主串中出现了几次。暴力来做,跑ac自动机,统计所有的失败指针对应的字符串。考虑如何优化,将失败指针反向,那么模式串的子树就是答案。用深搜序转换成线性,再用对应的数据结构维护就可以,可以用线段树,树状数组,数列分块等。我用的数列...原创 2019-02-11 21:08:35 · 248 阅读 · 0 评论 -
poj3261 后缀数组(模板)
原题:http://poj.org/problem?id=3261题解:求出现至少k次子串。后缀数组可以处理子串的问题。后缀数组主要的定义如下。rank[i] 表示第i个后缀的排名sa[i] 表示排名为i的哪个后缀h[i] 表示排名为i与i+1的最长公共前缀排名指字典序,可以用基数排序,倍增预处理上面3个数组。出现了K次的子串长度就是h数组连续k-1的最小值,我们要...原创 2019-02-12 22:51:48 · 178 阅读 · 0 评论 -
数列分块入门4(区间求和)
原题:https://loj.ac/problem/6280题解:这题不太难,分块求区间和就行了。#include<bits/stdc++.h>#define reg register#define N 50001#define M 300#define ll long longusing namespace std;int a[N],pos[N],n,m,s[M...原创 2019-01-09 20:42:10 · 563 阅读 · 0 评论 -
数列分块入门3(查询前驱)
原题:http://www.caioj.cn/problem.php?id=1246题解:本题要查询前驱,即比x小的最大值。考虑分块,对每个块排序,二分查找x,维护个最大值。#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<...原创 2019-01-08 22:19:31 · 205 阅读 · 0 评论 -
数列分块入门9(区间众数)
原题:https://loj.ac/problem/6285题解:基本题意求[l,r]的最小众数,对于集合 A,B 显然 mode(A and B)属于 mode(A) and B。这样就可以分块,预处理f[i][j]表示i-j的众数。每次查询时暴力查询头尾两块的数和中间块的众数就可以,关于查询x在[l,r]出现了几次,用动态数组存放x的下标,二分查找就好了。可以先给a数组离散化。这道题块的大...原创 2019-01-13 20:29:29 · 588 阅读 · 0 评论 -
数列分块入门8(区间修改)
原题:http://www.caioj.cn/problem.php?id=1251题解:分块,v[]为一整块颜色统一的颜色,若v==-1 则这个块的颜色不一样需要暴力修改。#include<bits/stdc++.h>#define reg registerusing namespace std;const int N=110000,M=550;int a[N],...原创 2019-01-11 21:44:15 · 339 阅读 · 0 评论 -
数列分块入门7(区间标记下放)
原题:http://www.caioj.cn/problem.php?id=1250题解:本题大意:区间加法,乘法,单点查询,设sum为块的加法标记,mul为乘法标记。通过分析有,那么对于每个块的维护就是把sum,mul都乘c,对于不完整的块,要把块上的标记下放在暴力改点。#include<bits/stdc++.h>#define reg register #defin...原创 2019-01-10 22:14:48 · 185 阅读 · 0 评论 -
数列分块入门6(单点插入)
原题:http://www.caioj.cn/problem.php?id=1249题解:对于暴力的单点插入,需要将后面的全部移动,可以将数列分块,sqrt(n)的块暴力。当在同一个块插入过多次时需要重构。不放每 sqrt(n)重构一次,可以保证复杂度。#include<bits/stdc++.h>#define reg register#define N 22000...原创 2019-01-10 18:17:50 · 290 阅读 · 0 评论 -
数列分块入门5(区间开方)
原题:http://www.caioj.cn/problem.php?id=1249题解:显然区间开方比较难做,但很容易发现2^32的数开4-5次方就会到1,考虑分块暴力,如果这个快全部是1的化就不用再维护,最坏的情况是1-n开4-5次方,可以接受。这道题加点小优化就可以特别快。#include<bits/stdc++.h> #define N 50005#define ...原创 2019-01-10 14:19:06 · 181 阅读 · 0 评论 -
数列分块入门2(区间小于c的个数)
原题:http://www.caioj.cn/problem.php?id=1245题解:我们可以分块处理。两边的块暴力,中间的块可以先预处理排序,再用lower_bound求出个数。#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include...原创 2018-12-23 22:40:02 · 150 阅读 · 0 评论 -
[TJOI2017]不勤劳的图书管理员 数列分块+二分
原题:https://loj.ac/problem/2639题解:就是求动态逆序对的和。考虑暴力的方法,对于区间[L,R] 把[L+1.R-1]的元素和L,R比,其实就是要求[L+1,R-1]中所有大于L的和,所有小于L的和,很容易想到数列分块,把每一个块排序,二分查找求和。要注意不要用STL,注意常数优化。#include<bits/stdc++.h>#define ll...原创 2019-04-26 19:09:18 · 174 阅读 · 0 评论