2024.10.23训练记录

上午 NOIP模拟

A

简单题。
类比树状数组,反向做二维前缀和。

在数组中对于左上角为{x_1, y_1},右下角为{x_2, y_2}的矩阵实现+k操作。
只需要在{x_1, y_1},{x_2 + 1, y_2 + 1}位置+k,{x_2 + 1, y_1},{x_1, y_2 + 1}位置-k。
最后再做一遍二维前缀和。

很好想到的。想到是应该的。
考试的时候没怎么浪费时间在这道题上。这是最好的。

B

可以直接做dp,考虑钦定f[i]为所有终点在i子树内的人都已经在点i上时,送完这些人再回到这个端点的最小步数。
运送一些人的车班数就是上取整。

另外一个写起来更简单的方法是:因为每个人中途可以不限次数放下。所以将一条路径[a_i, b_i]拆成路径上的每条边都要有一个学生走过。
这样树上差分后可以知道每条边被几个学生走过。
因为保证了b_i是a_i子树内的节点,所以学生都只会向下走。
每条边被学生经过的次数除以摆渡车容量的上取整就是车经过这条边的次数。
因为车要返回所以乘以2。
注意到车是从1出发,所以会经过所有子树内有乘客的点。
可以想象每个终点向根节点连一条链的并,这就是所有车会经过的边。
这些边中,没有送客需求的也会被走至少两次。

容易想到,因为不用回到根节点,所以挑一条最长的链留在它的终点。
这样统计答案就行了。

考场这题一点都没想到,说实话有一点被n\leq 200的部分分误导了。
三方的dp,就想把m、l都设进状态里,然后就觉得处理起来很麻烦,不会转移。
其实对于容量的处理就是除完上取整这种简洁的形式。

posted @ 2024-10-23 20:56  docx君  阅读(5)  评论(0编辑  收藏  举报