怎么做呢?博主没推出任何一步,只能做个没脑子的搬运工了。。。同时搬运下caoyue大佬和myh大佬的理解。
设有m个0
先考虑答案为len是否可行,可行的话一定 l e n < = m / 2 len<=m/2 len<=m/2,且选前len个和后len个0充当i和k一定存在方案。挺显然的。。。
把上面那句话转化一下,存在方案当且仅当存在i都在前半部分,j都在后半部分
考虑每种颜色
有了一半这个限制,如果一个颜色的某个位置在左半部分,那么只要保证了选的个数不超过m的一半,那么就不用担心右半部分的选择问题,所以考虑左边即可。
换句话说,没种颜色可以表示成一个二元组(l,r),表示可以选择前l个0中的一个或后r个0中的一个,且l<=m/2,r<=m/2,问最大匹配数
Ans=min(最大匹配数,m/2)
优先队列做法
如果左半部分还能选点,那就继续选,一定不劣
所以得出左半部分能选的最多点数L,把1~L的点都选了
我们要使得剩下的r尽量优秀
那么做法很明显了,无论从感性上还是理性上,x从L扫描到1,把未选的l>=x中最小的r给剔除了
记得最后加上l=0的r
整个过程可以用优先队列维护
Hall定理做法
目测这个做法可以使得l,r不满足<=m/2的限制
观察扩展Hall定理求最大匹配数:
A n s = ∣ S ∣ − m a x S ′ ⊆ S ( ∣ S ′ ∣ − ∣ t r ( S ′ ) ∣ Ans=|S|-max_{S' \subseteq S}{(|S'|-|tr(S')|} Ans=∣S∣−maxS′⊆S(∣S′∣−∣tr