D
给一张图,多次询问,每次 $u\leftarrow v$ 中经过的不重复点数量 $=z$ ,求经过边最大编号最小值
边权问题想到 $Kruskal$ 重构树
重构树上倍增二分即可
这道题还有一种整体二分+并查集做法,但我不会
1 | const int N=1e5+100; |
E
博弈论 每次操作将当前最大堆的糖果全部吃完或将每堆糖果吃掉一个,吃完的人输
GreenDay学长之前讲过
将每堆小石子的数量看成柱状图并排序,问题转化为从 $(1,1)$ 出发,每次只能向上或向右走一格,到边界者输
显然棱角处均为必败点,且打表得 $y=-k\times x$ 直线上的格子性质相同
找最大的 $(i,i)$ 再简单判断即可
1 | const int N=1e5+100; |
F
给你 $n$ 种不含白色颜色的球,每个球有 $m$ 个,把这 $n\times m$ 个球排成一排,把每一种颜色的最左边出现的球涂成白色,求有多少种不同的颜色序列
有 $m$ 个白球,$n$ 种其他颜色的球各 $m-1$ 个 只有任意前缀中白球的个数均大于其他颜色种类数时合法
考虑序列计数 $dp$: 枚举位置或元素,这里枚举元素
设状态 $f_{i,j}$ 表示在 $n\times m$ 个位置上填了 $i$ 个白球和 $j$ 个其他球
考虑合法序列的从左到右的第一个格子如何转移
1 | const int N=2e3+5,M=4e6+5; |