3 月水题练习
真是快呀😰,不知不觉一个月就过了?还是那么菜。
稍微整理一下这个月做的水题(不包含我写过题解的题)。
P3964 [TJOI2013] 松鼠聚会
定义两个点 \((x_{1},y_{1}) \ (x_{2},y_{2})\) 的切比雪夫距离为 \(\max(|x_{1}-x_{2}|,|y_{1}-y_{2}|)\)。
显然原题就是在就求切比雪夫距离之和最小值。
先考虑将曼哈顿距离转换:
那么 \((x_{1},y_{1})\) 到 \((x_{2},y_{2})\) 的曼哈顿距离就变成了 \((x_{1}+y_{1},x_{1}-y_{1})\) 到 \((x_{2}+y_{2},x_{2}-y_{2})\) 的切比雪夫距离。
那么曼哈顿意义下的坐标 \((x,y)\),可转化成切比雪夫意义下的坐标 \((x+y,x-y)\)。
那么显然切比雪夫意义下的坐标 \((x,y)\) 可以转换为曼哈顿意义下的坐标 \((\frac{x+y}{2},\frac{x-y}{2})\)。
然后就可以随便乱做了。
P3702 [SDOI2017] 序列计数
简单容斥一波,然后矩阵优化 dp 即可。
P3674 小清新人渣的本愿
bitset 板题。
复习一下它的一些用法:
-
定义:
bitset<N>s
-
赋值:(下标编号为 \([0,N-1]\))。时间复杂度为 \(O(1)\)。
-
位运算。时间复杂度为 \(O(\frac{n}{w})\)。
-
清空为 \(0\):
s.reset()
,时间复杂度为 \(O(\frac{n}{w})\)。 -
清空为 \(1\):
s.set()
,时间复杂度为 \(O(\frac{n}{w})\)。 -
查询是否全部为 \(0\)。
bool Get = s.none()
。时间复杂度为 \(O(\frac{n}{w})\)。 -
返回一个 \(1\) 的个数。
s.count()
。时间复杂度为 \(O(\frac{n}{w})\)。 -
全局取反。
s.flip()
。时间复杂度为 \(O(\frac{n}{w})\)。
然后这题使用 bitset 加莫队即可。时间复杂度 \(O(\frac{nm}{w})\)。
Ivan and Burgers
维护一个所有前缀的线性基。然后插入的时候,优先将位数高的位置加入 \(id\) 大的即可。
The Sum of the k-th Powers
记 \(f_{n} = \sum_{i=1}^{n}i^{k}\)。
将 \(f\) 做一个差分得到 \(1^k,2^k,\dots,n^{k}\) 为 \(k\) 次多项式。
那么 \(f\) 就是一个 \(k+1\) 次多项式,要用 \(k+2\) 个点值确定。拉格朗日插值即可。
CF995F
记 \(f(u,i)\) 表示以 \(u\) 为根的子树用 \([1,i]\) 染色的方案数。
可以发现设 \(u\) 的子树大小为 \(s_{u}\),那么 \(f(u,x)\) 是关于 \(x\) 的 \(s_{u}\) 次多项式。
归纳证明:
- 当 \(u\) 为叶子节点时,\(f(u,x)=x\)。
- 由于 \(f(u,x)-f(u,x-1) = \prod _{v \in son_{u}} f(v,x)\),因此 \(f(u,x)\) 是关于 \(x\) 的 \(s_{u}\) 次多项式。
拉格朗日插值一下。时间复杂度为 \(O(n^2)\)。
[AGC003C] BBuBBBlesort!
操作 \(2\) 就是任意排列下标同奇偶的元素。因此只需要看起始位置与结束位置的下标奇偶性是否不同即可,如果不同,贡献 \(+1\)。
P4345 [SHOI2015] 超能粒子炮·改
用 \(lucas\) 定理拆一下循环节即可。
P5376 [THUPC2019] 过河卒二
诈骗题。看出来答案是 \((n+1,m+1)\) 的方案数的话,容斥 + lucas 就做完了。
P2182 翻硬币
很简单的 dp。
P2487 [SDOI2011] 拦截导弹
线段树 + CDQ 板子题。
P1600 [NOIP2016 提高组] 天天爱跑步
分讨。dsu on tree 即可。
P5854 【模板】笛卡尔树
每个节点有两个权值 \(a,b\),一个要满足二叉搜索树的性质,一个要满足小根堆的性质。
将 \(a\) 排序(这题 \(a\) 就是它的编号,因此不用排序),利用单调栈维护一个右链即可。
P3959 [NOIP2017 提高组] 宝藏
显然对于任意一棵树,任意钦定一个点为根,把深度最深(记为 \(dep\))的点删掉。剩下来深度最深的点的深度为 \(dep-1\)。
因此可以记一个\(f_{s,i}\) 表示当前生成树为 \(s\),深度最高为 \(i\),考虑对深度最深的点i加入新的点 \(i\) 由上述结论可以证明这样做一定是对的。