BZOJ2138 stone
题目 考虑一个暴力做法: 把每个询问拆成 \(k_i\) 个点放在左边,每堆石头拆成 \(a_i\) 个点放在右边,每个询问的点到在这个询问区间内的石头连一条边,这样我们要做的就是判断有没有完美匹配。 根据Hall定理,对于任意一个左边的集合,其相邻的右边的点的个数要大于这个集合的大小。 然后我们发现如果把所有询问按左端点(或者右端点)排个序,那么我们只需要让左边每段区间的点都满足条件就行了。 并且由于每个询问的点连出来的边都是一样的,所以我们可以把它们合到一起判断。右边的每一堆石头同理。 那么也就是说,对于任何一段 \([l,r]\) 区间内的石头,需要满足询问区间完全包含于 \([l,r]\) 的询问的 \(k\) 的和 \(\le \sum\limits_{i=l}^r a_i\) 。 我们记 \(s\) 为 \(a\) 的前缀和数组。 同时我们注意到不存在区间相互包含,所以设 \(tl_i\) 表示左端点在 \([1,i]\) 区间内的询问的 \(k\) 的和, \(tr_i\) 表示右端点在 \([1,i]\) 区间内的询问的 \(k\) 的和。 那么完全包含于 \([l,r]\) 的询问的 \(k\) 的和就是 \(tr_r-tl_{l-1}\) 。 我们要满足的条件就变成了 \(\forall l\le r,tr_r-tl_{l-1}\le s_r-s_{l-1}\)