NOIP2022 题解
Crystallinum
2022年12月25日 17:15

弱弱的 JS 一等来发篇题解。


T1 种花(plant)

T1 还是很简单的。

肉眼观察就可以发现,F 形是可以由 C 形长出来的。所以还是就演变成如何求 C 形的个数。

我们考虑枚举每一个形状的左上端点。那么以这个点延展开来的 C 形的个数就应该是这个点向右最多能延展的格子数与其能向下延展的每个格子的向右延展的格子数乘积的和。即:

ans_%7Bi%2Cj%7D%20%3D%20r_%7Bi%2Cj%7D%20%5Ctimes%20%5Csum_%7Bk%3D0%7D%5E%7Bd_%7Bi%2Cj%7D%7D%20r_%7Bi%2Bk%2B1%2Cj%7D

预处理求 r_%7Bi%2Cj%7D 和 d_%7Bi%2Cj%7D 还是很好办的。最后前缀和优化一下即可。


T2 喵了个喵(meow)

T2 非常搞人心态。

看一眼 k 的范围,有一个非常容易想的办法,我们可以将这么多卡牌摊开,这样的话,我们就可以尽量把每一种类型的牌露在栈顶或者压在栈底。这就分别对应了两种操作方式。

情况 1:k%3D2n-2

一通乱消,这时候我们的栈是够用的。也就是说,一个栈放一对牌是没有问题的。这样似乎用不到操作 2。

情况 2:k%3D2n-1

多了一种牌。嘶……这样我们就必须用到操作 2 了。这也就意味着我们得留出一个空栈来放进行操作 2 的牌。我们暂且叫它 se。((^-^):stack of emptyness 的意思,不要乱想)

显然不是每一张牌都要无脑塞到 se 当中去的。我们看一看别的栈,发现我们可以瞄准别的栈栈底的牌,貌似很可以?然而这就会出现我们要等的牌很久没来导致堆积成山的形势出现。我们现在考虑预支未来:瞄准放在栈顶的牌——这么一来反而可以,因为后面要形成的栈底牌都是现在的栈顶牌。

现在我们记情况 1 中的策略为策略 A,情况 2 的策略为策略 B。一开始我们先归类:将牌种类为 x 的牌扔到 s_x 号栈去。然后判断有没有前面的牌在里面,有就放进去;如果 x 与牌堆顶的牌是同类,那么就把这两张牌塞到 se 里面去,接着按照策略 A 或 B 处理都没问题。


T3 建造军营(barrack)

T3 有点纸老虎。

B 国炸掉了割边之后,图才会不连通。我们先用 Tarjan 求出边双之后缩点,整个图就变成一个树喽。想办法搞树形 dp。

令 f(u%2C0%2F1) 为 u 的子树中没有 / 有军营的方案数。当然啦,若有军营,则所有的军营都必须要和 u 连通。再令 V_u 为此边双分量中点的个数,E_u 为此边双分量中边的个数。

先考虑如何统计答案。我们强制让 u 子树外的点都不建军营,同时一定不选 fa_u%20%5Crightarrow%20u 的边。

令 e(u) 为 u 的子树中边的个数。

e(u)%3DE_u%2B%5Csum_%7Bv%20%5Cin%20son(u)%7D%20(s(v)%2B1)

则:

ans%3Df(u%2C1)%5Ctimes%202%5E%7Bs(1)-s(u)-1%7D

显然:

f(u%2C0)%3D2%5E%7BE_u%7D%5Ctimes%20%5Cprod_%7Bv%20%5Cin%20son(u)%7D%202f(v%2C0)

f(u%2C1)%3Df(u%2C0)%20%5Ctimes%20f(v%2C1)%20%2B%20f(u%2C1)%20%5Ctimes%20(2f(u%2C0)%2Bf(v%2C1))

初始化:

f(u%2C0)%3D2%5E%7BE_u%7D

f(u%2C1)%3D2%5E%7BV_u%2BE_u%7D-f(u%2C0)


T4 比赛(Match)

久违的数据结构。

离线,线段树维护询问……没了?

确实,没了。但是码量有点小大。


呼,高中的第一次 NOIP 就这么结束了。