题意
一行多个颜色,挑选尽可能多的颜色,保证存在一个界限,界限往左和往右最多某种颜色只有一个。保证这个颜色必须是某头牛需要的颜色。
题解
题意简化之后就是枚举分界点,由于颜色互不干扰,所以颜色也可以枚举。
得到分界点左右每个颜色的个数(统计的时候可以
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=i−1,这样能保证求的答案最大,并且由于特殊化了
R
R
R,所以方案不会重复。
操作就是计算出所有
L
=
0...
n
−
1
,
R
=
L
+
2
L=0...n-1,R=L+2
L=0...n−1,R=L+2的方案数,即不包括第
i
i
i个方案数。
总方案数减去即可。
这道题困扰了我好久,最后照着别人代码写,就不贴了,数理基础太差了。最近学习算法的重心应该从差分约束转变为莫比乌斯。