题解-CF375
CF375A Divisible by Seven
注意到 \(1,9,8,6\) 全排列可以得到所有 \(\bmod 7\) 的余数。
然后别的数随便排,这四个数选个排法就好了。
CF375B Maximum Submatrix 2
方法 \(1\)
我场上怼的做法,时间复杂度 \(\Theta(nm\log )\),加个快读就过了。
分治,每次处理 \([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(n\sqrt n)\)。
方法 \(2\)
野蛮 dsu on tree
,询问挂到树上节点上。
然后对于每个非重儿子,先解决子树,然后再同莫队维护两个东西把贡献加上。
对于重儿子,解决完子树后不删贡献。
由于走轻儿子深度不会超过 \(\Theta(\log n)\),重儿子的复杂度不重复发生,所以时间复杂度 \(\Theta(n\log 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)\leftarrow\min f(u,i,t)+f(v,j,t)\)(为什么不是 \(i+j-1\) 啊?可能是您没理解这个
dp
):- 如果 \(t\) 在 \(v\) 和 \(u\) 的子树外,那么它们都不需要统计这个黑点。
- 如果 \(t\) 在之前 \(u\) 的子树内,那么这个黑点算在 \(i\) 中不算在 \(j\) 中。
- 如果 \(t\) 在 \(v\) 的子树内,这个黑点算在 \(j\) 中不算在 \(i\) 中。
-
如果 \(a\neq 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\neq u)\),初始化 \(f(u,0,v)=0\)。
然后答案就是所有 $i\le $ 原来黑点数量的 \(f({\rm root},i,t)\) 最小值。
aclink,要用 short
卡空间。