冬令营颓废笔记
分块
线性序列分块
主要用于处理不便于合并两个区间的问题。
蒲公英
题面
区间众数,强制在线,\(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\):暴力枚举即可