CF1534
- A:二分图染色。
- B:贪心将单独的一列往下减。
- C:并查集。
- D:先询问一次,然后选择奇数层或偶数层的点询问相邻的即可.
- E:先钦定所有都是1,然后需要变成0,每一次选择尽量多的1变为0,不够的用0来补充,贪心下去即可。或者DP,设 f i f_i fi表示 i i i个 1 1 1要操作多少次得到,可以将 f j , f k f_j,f_k fj,fk转移到 f j + k − 2 i f_{j+k-2i} fj+k−2i,然后倒着模拟回去即可。
F
- 主要需要简化模型之后发现性质。
- 显然建图之后tarjan缩点,然后需要在DAG上选点,使得所有下往上第 a i a_i ai个关键点都能够被覆盖。
- 然后简化一下,将能够被别的关键点到达的关键点删除,那么可以发现这时有一个很优美的性质:每一个点能够覆盖的关键点是一个区间。
- 然后直接贪心即可。
G
- 主要需要观察凸函数,并有一个优美的方式去维护它。
- 首先将切比雪夫距离转化为曼哈顿距离,原图中的点 ( x , y ) (x,y) (x,y)在新图中的 ( x + y , x − y ) (x+y,x-y) (x+y,x−y)上,那么原图中的移动变为了 ( + 1 , + 1 ) (+1,+1) (+1,+1)或 ( + 1 , − 1 ) (+1,-1) (+1,−1),因此当 x = X x=X x=X时曼哈顿距离最小。
- 现在我们需要优化一个简单的DP, f x , y f_{x,y} fx,y表示在 ( x , y ) (x,y) (x,y)的最小答案,显然固定一个 x x x, f x , y f_{x,y} fx,y是关于 y y y的分段函数,进一步的这是一个凸函数(由于若干个凸函数加起来还是一个凸函数),并且斜率的总变化不超过 n n n。
- 现在我们需要维护两个操作:1.将原函数向两边扩充,2.将当前函数加上一个 V V V型的函数。
- 考虑1操作只需要将最小值的区间扩大,两边顶点同时扩,因此我们可以对于极值左边和右边分别维护一个单调队列,单调队列可重复并且每一个点按顺序表示斜率1的变化,又有所有的端点根据 x x x加或减,因此不妨将 x x x当作全局tag,存 y − x y-x y−x至堆中。
- 考虑2操作,相当于是在 V V V的顶点插入两个点,表示斜率 + 2 +2 +2的变化,需要同时维护答案以及两个堆堆顶的变化,即有一个堆顶移到了另一边。
- 至此就可以用优美的实现,简短而快速的搞定这题了。
H
- 首先贪心选择叶子作为根,就能够将叶子到当前根的路径上的点分开,然后考虑dp计算这个选择的次数,只需要让当前点的路径接到儿子上,因此将儿子从大到小排序之后贪心选最大值最小。
- 注意 f f f节点需要选择两个,因此对于所有 f f f需要换根。
- 交互就模拟一下上面的贪心。