题意
你有 $n$ 个集合,每个集合里有一些非负整数。
有 $4$ 个桶,现在要把每个非负整数放入其中 $1$ 个桶。
限制条件:
1. 同一集合的所有数要么都放入第 $1,2$ 个桶,要么都放入第 $3,4$ 个桶。
2. 有 $k$ 个数有特殊要求:不能放入前 $2$ 个桶或不能放入后 $2$ 个桶。
3. 设 $cnt_i$ 为第 $i$ 个桶放的数的总和,要求 $cnt_1+cnt_2le C_0$,$cnt_3+cnt_4le C_1$,$cnt_1+cnt_3le D_0$,$cnt_2+cnt_4le D_1$。
求满足限制条件的放置方案数膜 $998244353$。
有 $Tle 5$ 组数据。
$cle nle 1000$,$kle 30$,$M=max{C_0,C_1,D_0,D_1}le 2500$,$ 1le s_ile min{M,10}$。
题解
没错这道思维题只考了你 01 背包
50分
考虑暴力,不难发现由于每所学校只能在蓝、红阵营中选一个,再在鸭、R 派系中选一个,所以我们只需要记选择蓝派系的人数 和选择鸭派系的人数,就能对应一种各派系的人数情况了。总人数减去蓝派系的人数就是红派系的人数,总人数减去鸭派系的人数就是 R 派系的人数,可以不用记。
写成 $dp$ 就是 $dp(i,x,y)$ 表示前 $i$ 所学校中,蓝阵营得到了 $x$ 人,鸭派系得到了 $y$ 人。
把所有学校按城市排序,由于同城学校必须选择相同阵营,我们对每座城市先枚举其选择的阵营,再对该城市的学校做 $dp$。
转移时要注意一下 $x$ 和 $y$ 的上界,可以优化常数(不加可能会被卡时间)。
这就是 $O(n imes m^2)$ 的 $50$ 分 $dp$。
k=0
然后我们发现,一所学校选的阵营和派系并没有关系,只要记录阵营和派系各自的人数之和就行了。
于是 $dp$ 可以写成:$dp_1(i,j)$ 表示前 $i$ 所学校中,蓝阵营得到了 $x$ 人;$dp_2(i,j)$ 表示前 $i$ 所学校中,鸭派系得到了 $y$ 人。
两个 $dp$ 的每种人数状态相乘,在对其求和,就是方案数。
100分
将有限制的和无限制的分开算。
对于阵营,我们把带有限制的学校的城市与其它城市分开算。
对于派系,我们把有限制的学校与其它学校分开算。
有限制的这部分要维护二维信息 $dp$,