冬令营颓废笔记

分块

线性序列分块

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

蒲公英

题面

区间众数,强制在线,\(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\):暴力枚举即可

带修莫队

posted @ 2019-01-27 17:16  GoldenPotato  阅读(262)  评论(0编辑  收藏  举报