分块
线性序列分块
主要用于处理不便于合并两个区间的问题。
蒲公英
题面
区间众数,强制在线,(n,m<=40000)
Solution
本题为序列分块经典题。
显然要先离散化,对序列分块。
预处理出:
(cnt[i][j]):到(i)块颜色为(j)的总数
(f[i][j]):从块(i)到(j)的众数:枚举块的开头,扫一遍即可
(num[i][j]):从块(i)到(j)的众数是什么数
然后我们在询问的时候,先把块里面的众数找到,然后暴力处理左右两边的散点,开桶计算,每个数字判断一下即可。
树上分块
块的计数
题面
问有多少种方法把一颗树分成若干块使得每个块的点数相同。
Solution
观察后可以发现几个性质:
1.若让某颗子树能分成若干个大小为(x)的块,则其点数必为(x)的倍数。
2.若让整棵树可行,则必须有(n/x)个可行子树。
王室联邦
题面
给定一颗(n)个节点的树,把这棵树分为若干个块,块的大小(<=3B &>=B),两个块之间可以共用1个节点,问如何划分。(n<=1000)
Solution
暴力搜索,递归结束前进栈,做完一个孩子节点后检查,若满足要求则出栈。
事实上,这是把一个树分块的一种方法
GTY的妹子树
题面
维护一棵初始有n个节点的有根树(根节点为1),树上节点编号为1-n,每个点有一个权值wi。
支持以下操作:
0 u x 询问以u为根的子树中,严格大于x的值的个数。(u=lastans,x=lastans)
1 u x 把u节点的权值改成x。(u=lastans,x=lastans)
2 u x 添加一个编号为"当前树中节点数+1"的节点,其父节点为u,其权值为x。(u=lastans,x=lastans)
最开始时lastans=0。
Solution
分块套splay
考虑这样分块:dfs,若父亲节点所在的块的块未满,则塞入父亲节点所在块中,否则自成一块。
事实上,这是树分块的另一种方法
块内有序,块外暴力即可。
莫队
不带修莫队
奇偶排序:若左端点不在同一个块里面,按左端点排序,否则对右端点排序,当左端点在奇数块,则把右端点从小到大排序,否则把右端点从大到小排序。
由乃的玉米田
题面
每次询问一个区间,询问这个区间内是否有:
任意两个数相加等于(x)
任意两个数相减等于(x)
任意两个数相乘等于(x)
Solution
用bitset来存数字是否出现
是否相加有(x):将整个bitset向左移动(x)位,与原bitset and一下即可
是否相减有(x):将整个bitset向右移动(x)位,与原bitset and一下即可
是否相乘有(x):暴力枚举即可