A String Building
考虑一段全部为 A A A或 B B B的子段,不难发现只有在该子段长度为 1 1 1的时候不能用 A A AA AA或者 A A A AAA AAA凑出,这样顺序扫一遍即可。
B Consecutive Points Segment
考虑顺序进行移动,如果一个点它不受左侧点的制约,那么一定将它越往右越好,如果受制约判断二者之间距离并向左移或者不移,如果在左侧的点考虑完之后还相差 ≥ 2 \geq 2 ≥2那么就是不合法的,这样我们在扫的时候判断是否有不合法的情况即可。
C Dolce Vita
首先将序列排序,考虑到随着天数的增长能购买物品的区间一定是单调递减的一个前缀,这样我们不断将右边界向左移动即可,注意判断 r r r减小时上限天数不变的情况。
D Insert a Progression
考虑一个序列 7 2 10 7~2~10 7 2 10,我们在 7 2 7~2 7 2之间插入 2 2 2到 7 7 7之间的任何数都不会对于答案产生贡献,因为我们可以顺序插入。这样不难发现只有 1 1 1到 m i n n − 1 minn-1 minn−1和 m a x x + 1 maxx+1 maxx+1到 x x x的数会产生贡献,并且一定是将这两段分别作为整体插入最优,这样实际上就是考虑插入 1 1 1和 x x x,可以线性解决。
E Preorder
我们定义两个本质相同的子树为通过任何的交换方式能够使得二者的中序遍历字符串相等。这样我们考虑父节点 u u u的两个子树,定义 f [ u ] f[u] f[u]表示 u u u节点本质不同的字符串的种类数,如果两个子树本质相同就有 f [ l s ] ∗ f [ r s ] f[ls]*f[rs] f[ls]∗f[rs],否则有 f [ u ] = 2 ∗ f [ l s ] ∗ f [ r s ] f[u]=2*f[ls]*f[rs] f[u]=2∗f[ls]∗f[rs],这样我们只需要判断两个子树本质是否相同,考虑用哈希,考虑将左右子树取在 b a s e x base^x basex的同一个 x x x里,这样左右子树的相对顺序就不会产生影响。