- NC https://ac.nowcoder.com/acm/contest/17761/F
大意:现有 n 个仓库,编号 1到 n,当购进货物的时候,商家会把他们放到相邻的仓库中,当购货完毕后,输出种类最多的仓库的编号,若有多个输出编号最小的那个。n代表仓库的个数,m代表进货次数,接下来m行,每行三个数字 l,r,c 即放到仓库的左右端点和货物的种类。1<=n,m<=1e5, 1<=l,r<=n, 1<=c<=1e9.
思路: 从简单到复杂慢慢过渡,如果每次进货的货物种数不一样的话,显然可以用差分前缀和来做,所以我们想到把货物种数相同的存到一块,然后区间合并,然后就可以用差分+前缀合做了。种数最大数 1e9 所以用map 离散化。
总结:思考问题从简单到复杂慢慢过渡,一步一步来。
- NC https://ac.nowcoder.com/acm/contest/17761/D
在 n 行 m 列的棋盘放一些棋子,每个格子最多放一个棋子,且不同颜色的棋子不能让放在同一行或同一列,求最多有多少种方法。结果对 1e9+7 取模。输入第一行 n,m,c 代表行数和列数以及颜色数,接下来c个正整数,即每个颜色的棋子数,总数不超过 n * m。
思路:方案数?有限制的放棋子?是不是很熟悉?每个棋子具体放在哪个位置对方案数是没有影响的。因为每行每列不能出现颜色不一样的,按照棋子去状态转移是很复杂的,所以我们根据颜色去放棋子。
即 f[k, i, j] 表示前 k 种颜色,占了 i 行,j 列的放法,属性为方案数。
f[k,i, j] += f[k-1,a,b] * C(n-a, i-a) *C(m-b,j-b) * (把第 k 种颜色的棋子刚好放满 i-a行,j-b 列的方案数)
接下来就是怎么算 把 第 k 种的 棋子恰好放满 i-a 行,j-b 列,显然直接算是不行的,需要用到容斥原理。
我们开一个 g数组,先提前预处理出来,即g[k,i,j] 表示把 k 种棋子恰好放 i 行 j 列的方法。
显然 放 k 种 棋子 有 i 行 j 列 不放, 也可以用它表示。
所以 g[k,i, j]=总方案数 - 某行某列不放的方案数。即 g[k,i,j]=C(i*j, arr[k]) - g[k,x,y] * C(i,x) * C(j,y)
1<=x<i , 1<=y<j。