冬令营颓废笔记

分块

线性序列分块

主要用于处理不便于合并两个区间的问题。

蒲公英

题面

区间众数,强制在线,(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,若父亲节点所在的块的块未满,则塞入父亲节点所在块中,否则自成一块。
事实上,这是树分块的另一种方法
块内有序,块外暴力即可。
kuLzRA.png
kuOAIg.png


莫队

不带修莫队

奇偶排序:若左端点不在同一个块里面,按左端点排序,否则对右端点排序,当左端点在奇数块,则把右端点从小到大排序,否则把右端点从大到小排序。

由乃的玉米田

题面

每次询问一个区间,询问这个区间内是否有:
任意两个数相加等于(x)
任意两个数相减等于(x)
任意两个数相乘等于(x)

Solution

用bitset来存数字是否出现
是否相加有(x):将整个bitset向左移动(x)位,与原bitset and一下即可
是否相减有(x):将整个bitset向右移动(x)位,与原bitset and一下即可
是否相乘有(x):暴力枚举即可

带修莫队

原文地址:https://www.cnblogs.com/GoldenPotato/p/10327349.html