CF375A Divisible by Seven
注意到 (1,9,8,6) 全排列可以得到所有 (mod 7) 的余数。
然后别的数随便排,这四个数选个排法就好了。
CF375B Maximum Submatrix 2
方法 (1)
我场上怼的做法,时间复杂度 (Theta(nmlog )),加个快读就过了。
分治,每次处理 ([l,r]) 的列,找到中线,设 (f(l,r)) 表示中线左边有连续超过 (l) 个 (1),中线右边有超过 (r) 个 (1) 的行数,答案与每个 ((l+r)f(l,r)) 取最大值即可。
方法 (2)
时间复杂度 (Theta(nm)),先预处理 (f(i,j)) 表示 ((i,j)) 这个格子左边的连续的 (1) 个数。然后对每个 (j),把 (i) 这维排序然后计算贡献即可。这个排序可以用个桶。
CF375C Circling Round Treasures
看清题意:炸弹和宝藏合起来不超过 (8) 个。
题目中说了如何判断回路包含物品,但讲得不清楚。
大概就是每个物品向右有一条射线,如果穿过回路奇数次就被包括。
注意:把路径想象成一条曲线,然后这条射线可以与这个物品格子的上边线重合,这样可以防止把回路的一部分顺着这条射线走当成被包含。
然后把一个炸弹当作价值 (-infty) 的宝藏,就可以分层图最短路,节点 ((x,y,s)) 表示在 (x,y) 这个位置,对于 (s) 这个集合的宝藏射线穿过次数为奇数。
然后得出最短路以后答案与每个 (s) 的价值 (-) 起点与这个集合节点的最短路取 (min) 即可。
CF375D Tree and Queries
方法 (1)
把 dfn
求了,然后转为区间查询。莫队,维护每个颜色出现次数和大于某个次数的颜色数,时间复杂度 (Theta(nsqrt n))。
方法 (2)
野蛮 dsu on tree
,询问挂到树上节点上。
然后对于每个非重儿子,先解决子树,然后再同莫队维护两个东西把贡献加上。
对于重儿子,解决完子树后不删贡献。
由于走轻儿子深度不会超过 (Theta(log n)),重儿子的复杂度不重复发生,所以时间复杂度 (Theta(nlog n))。
CF375E Red and Black Tree
多好的问题啊,感觉最近还是要多自己思考,别打完比赛就盲目贺题。
听说有个什么单纯形的线性规划,我永远不会学它的!
设 (f(u,i,t)) 表示在节点 (u) 的子树中有 (i) 个点必须是黑点(其他点也可以是黑点的),然后用 (t) 这个节点解决 (u) 需要满足的条件的最小代价(相当于转化问题:从交换颜色,变成固定每个颜色数量,然后求出最少交换代价)。
然后考虑怎么转移,如果子树状态是 (f(v,j,a)) 要合并上来:
-
如果 (a=t),那么 (f(u,i+j,t)leftarrowmin f(u,i,t)+f(v,j,t))(为什么不是 (i+j-1) 啊?可能是您没理解这个
dp
):- 如果 (t) 在 (v) 和 (u) 的子树外,那么它们都不需要统计这个黑点。
- 如果 (t) 在之前 (u) 的子树内,那么这个黑点算在 (i) 中不算在 (j) 中。
- 如果 (t) 在 (v) 的子树内,这个黑点算在 (j) 中不算在 (i) 中。
-
如果 (a eq t),易证:只有 (a) 在 (v) 子树中且 (t) 在 (v) 子树外是优化的:
- 如果 (a) 在 (v) 子树外,那么 (u) 比 (v) 离 (a) 更近,所以应该 (t=a)。
- 如果 (t) 在 (v) 子树内,那么 (v) 比 (u) 离 (t) 更近,所以应该 (a=t)。
- 然后合并完后是 (f(u,i+j,t))(要求 (t) 在 (v) 子树外),直接找到对于每个 (v) 子树内的 (a) 最小的 (f(v,j,a)) 即可转移。
然后再想想该怎么初始化:
-
首先先把所有
dp
值赋为 (+infty)。 -
对于节点 (u),初始化 (f(u,1,u)=1-col_u)。
-
对于节点 (u) 和满足 (dis(u,v)le x) 的 (v(v eq u)),初始化 (f(u,0,v)=0)。
然后答案就是所有 $ile $ 原来黑点数量的 (f({ m root},i,t)) 最小值。
aclink,要用 short
卡空间。