E. Cow and Treats

题意

一行多个颜色,挑选尽可能多的颜色,保证存在一个界限,界限往左和往右最多某种颜色只有一个。保证这个颜色必须是某头牛需要的颜色。

题解

题意简化之后就是枚举分界点,由于颜色互不干扰,所以颜色也可以枚举。
得到分界点左右每个颜色的个数(统计的时候可以 O ( 1 ) O(1) O(1)递推着求)
从而可以二分出有多少牛可以选。
得到 L , R L,R L,R;
为了保证不重复选同一只,答案是 m i n ( L , R ) ∗ ( m a x ( L , R ) − 1 ) min(L,R)*(max(L,R)-1) min(L,R)(max(L,R)1)
但是如果只存在一边有,那么这个颜色贡献只有 1 1 1了,方案数是相加。

还有一个问题就是枚举分界点的时候,可能会有相同方案,我们需要人为把方案特殊化。总方案数可以划分成:不选右边的,选了第 i i i个作为右边的;
前者即是 L = n , R = 0 L=n,R=0 L=n,R=0
后者,为了保证答案最大, L = i − 1 L=i-1 L=i1,这样能保证求的答案最大,并且由于特殊化了 R R R,所以方案不会重复。

操作就是计算出所有 L = 0... n − 1 , R = L + 2 L=0...n-1,R=L+2 L=0...n1,R=L+2的方案数,即不包括第 i i i个方案数。
总方案数减去即可。

这道题困扰了我好久,最后照着别人代码写,就不贴了,数理基础太差了。最近学习算法的重心应该从差分约束转变为莫比乌斯。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值